将data.table按几列分组时如何在输出中保留列

pos*_*def 2 r data.table

我正在尝试“整理”一个大型数据集,其中多个不同类型的数据合并在列中,而某些数据合并在列名中。这是生物学数据集中的常见情况

我的数据表中有重复的测量值,我想将其平均化。将数据转换为整齐的格式后,这些复制值将成为其他行。如果我尝试按几列汇总/分组并计算重复项的平均值:

collapsed.data <- tidy.dt[, mean(expression, na.rm = T), by=list(Sequence.window,Gene.names,ratio,enrichment.type,condition)]
Run Code Online (Sandbox Code Playgroud)

我得到的结果表只有在bystatement中使用的列,然后是mean(expression)as列V1。是否可以获取所有其他(不变)列?

一个简单的示例显示了我要实现的目标,如下所示:

library(data.table)
dt <- data.table(a = c("a", "a", "b", "b", "c", "a", "c", "a"), b = rnorm(8), 
                 c = c(1,1,1,1,1,2,1,2), d = rep('x', 8), e = rep('test', 8))
dt[, mean(b), by = list(a, c)]
#   a c         V1
#1: a 1 -0.7597186
#2: b 1 -0.3001626
#3: c 1 -0.6893773
#4: a 2 -0.1589146
Run Code Online (Sandbox Code Playgroud)

正如你所看到的列de被丢弃。

Uwe*_*Uwe 6

一种可能性是在分组中包括de

res <- dt[, mean(b), by = list(a, c, d, e)]
res
#   a c d    e         V1
#1: a 1 x test  0.9271986
#2: b 1 x test -0.3161799
#3: c 1 x test  1.3709635
#4: a 2 x test  0.1543337
Run Code Online (Sandbox Code Playgroud)

如果要保留除要合计的那一列以外的所有列,可以采用更具编程性的方式执行此操作:

cols_to_group_by <- setdiff(colnames(dt), "b")
res <- dt[, mean(b), by = cols_to_group_by]
Run Code Online (Sandbox Code Playgroud)

结果与上面相同。

这样,您减少了行数。如果要保留所有行,则可以添加其他列:

dt[, mean_b := mean(b), by = list(a, c)]
dt
#   a          b c d    e     mean_b
#1: a  1.1127632 1 x test  0.9271986
#2: a  0.7416341 1 x test  0.9271986
#3: b  0.9040880 1 x test -0.3161799
#4: b -1.5364479 1 x test -0.3161799
#5: c  1.9846982 1 x test  1.3709635
#6: a  0.2615139 2 x test  0.1543337
#7: c  0.7572287 1 x test  1.3709635
#8: a  0.0471535 2 x test  0.1543337
Run Code Online (Sandbox Code Playgroud)

在此,通过引用进行dt修改,即不复制所有,这可以节省大量数据的时间。dt