簡體   English   中英

R-與配合使用時data.table不分組

[英]R - data.table not grouping when using with

更新-似乎with = Fj表達式以及(至少某些) 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-expressionwith = FALSE模式下, j-expression將始終被解釋為完整的列(就像data.frame )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM