[英]R - data.table not grouping when using with
更新-似乎with = F
與j
表達式以及(至少某些) by =
情況不兼容。
采取以下方案並盡可能簡化它:
dt <- data.table(group1 = c("a", "a", "a", "b", "b", "b"),
group2 = c("x", "x", "y", "y", "z", "z"),
data = c(rep(T, 3), rep(F, 3)))
dt[
,
3,
with = F,
by = list(group1, group2)
]
data
1: TRUE
2: TRUE
3: TRUE
4: FALSE
5: FALSE
6: FALSE
>
dt[
,
data,
by = list(group1, group2)
]
group1 group2 data
1: a x TRUE
2: a x TRUE
3: a y TRUE
4: b y FALSE
5: b z FALSE
6: b z FALSE
>
表達式行為在?data.table
中以回旋方式?data.table
:
單個列名,單個列名的expresson,表示列名的表達式的list(),計算結果為list的表達式或函數調用(包括data.frame和data.table也是列表),或(當with = FALSE) 名稱或位置向量以選擇 。
我在文檔中沒有看到with = F
禁用by =
的任何文檔,但在這種情況下似乎確實如此。
我遇到一個問題,其中data.table使用或忽略by =
取決於我是否with = F
使用。
library(data.table)
dt <- data.table(group1 = c("a", "a", "a", "b", "b", "b"),
group2 = c("x", "x", "y", "y", "z", "z"),
data = c(rep(T, 3), rep(F, 3)))
# without with = F
dt[
as.vector(!is.na(dt[, 3, with = F])),
sum(data),
by = list(group1, group2)
]
>
group1 group2 V1
1: a x 2
2: a y 1
3: b y 0
4: b z 0
# with = F
dt[
as.vector(!is.na(dt[, 3, with = F])),
sum(3),
with = F,
by = list(group1, group2)
]
>
data
1: TRUE
2: TRUE
3: TRUE
4: FALSE
5: FALSE
6: FALSE
我試過使用數字向量和by =
的字符向量,但均無效。
sum()
是一個示例函數,當我在j
上不使用函數時,我也會遇到相同的基本問題。
最后,我需要使用with = F
遍歷for
循環中的data.table
多個列。
有什么建議么?
對於具有命名列的數據,一個很好的經驗法則是- 永遠不要使用列號 -有時列會重新排列,這可能會使您的代碼完全損壞。 當然,對於任何經驗法則來說都有例外,但是您需要證明您的案子值得例外,因此我認為現在還不是。
因此,如果要輸入代碼,請執行以下操作:
dt[!is.na(data), sum(data), by = .(group1, group2)]
如果您在變量中使用了列名,則可以執行以下操作:
col = "data"
dt[!is.na(get(col)), sum(get(col)), by = .(group1, group2)]
至於by
with = FALSE
一起使用-該模式旨在與data.frame
兼容,后者沒有by
參數,但是即使您支持by
參數,由於j-expression
在with = FALSE
模式下, j-expression
將始終被解釋為完整的列(就像data.frame
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.