【问题标题】:How to keep columns in the output when grouping a data.table by several columns按几列对data.table进行分组时如何在输出中保留列
【发布时间】:2017-08-11 09:20:29
【问题描述】:

我正在尝试“整理”一个大型数据集,其中将多个不同类型的数据合并到列中,并将一些数据合并到列名中。这是a common scenario in biological dataset

我的数据表有重复的测量值,我想将其折叠成平均值。将数据转换为整洁的格式,这些复制值变成了额外的行。如果我尝试按几列聚合/分组并计算复制的平均值:

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

我得到一个结果表,其中仅包含 by 语句中使用的列,然后是 mean(expression) 作为列 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

如您所见,de 列已删除。

【问题讨论】:

  • 你也需要总结一下。即类似dt[,.(mean(b), head(d, 1), head(e, 1)), by=list(a,c)]
  • 这是因为 data.table 无法知道您想要获取 de 的哪些值,即对于 ab 的每个组合,您可以有多个可能de 中的值。您需要具体说明您想要的回报
  • 通常我将要保留的列添加到 by 参数中。

标签: r data.table


【解决方案1】:

一种可能性是在分组中包含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

如果您想保留 所有 列,但要聚合的列除外,您可以以更程序化的方式执行此操作:

cols_to_group_by <- setdiff(colnames(dt), "b")
res <- dt[, mean(b), by = cols_to_group_by]

结果同上。

这样,您减少了行数。如果要保留所有行,可以添加一个额外的列:

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

这里,dt 被修改引用,即不复制所有 dt,这可能会节省大量数据的时间。

【讨论】:

    猜你喜欢
    • 2018-07-10
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2023-02-01
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多