我正在努力"整洁"一个大型数据集,其中多个不同类型的数据在列中合并,一些数据在列名中合并。这是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
正如您所看到的,d
和e
列已被删除。
答案 0 :(得分:4)
一种可能性是在分组中加入d
和e
:
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
,这可能会节省大数据的时间。