我有一个如下所示的数据框(20,000 行 x 49 列)。每行都有一个唯一的名称 (ID),每个 ID 在 3 列中有 3 次重复读取(例如 D15C D15C.1 D15C.2)。 colnames ("D15C") 的前 4 个字母是组名。我需要按组名平均列(例如平均 D15C、D15C.1 和 D15.2 以获得 D15C),因此最终表将从 49 列合并为 16 列。
ID D04C D04C.1 D08H D08H.1 D08H.2 D15C D15C.1 D15C.2 D15L D15L.1 D15L.2
1 1367452_at 11.11 10.93 11.85 10.94 10.87 10.73 10.62 10.85 10.73 10.77 10.52
2 1367453_at 9.65 9.94 9.78 9.68 9.67 9.86 9.71 9.82 9.74 9.71 9.76
3 1367454_at 10.19 10.36 9.68 10.07 10.08 10.35 10.26 10.32 10.27 10.19 10.47
(… 20000 rows)
我将其转置并编辑为以下数据框以使用聚合:
ID 1367452_at 1367453_at 1367454_at ... ...
1 D04C 11.11 9.65 10.19
2 D04C 10.93 9.94 10.36
3 D08H 11.85 9.78 9.68
4 D08H 10.94 9.68 10.07
5 D08H 10.87 9.67 10.08
6 D15C 10.73 9.86 10.35
7 D15C 10.62 9.71 10.26
8 D15C 10.85 9.82 10.32
9 D15L 10.73 9.74 10.27
10 D15L 10.77 9.71 10.19
11 D15L 10.52 9.76 10.47
但是,以下聚合(“agg”是数据帧名称)需要 370 秒才能完成。问题是我有100张这种 table 在等......
agg <- aggregate(x = agg[, 2:ncol(agg)], by = list(ID = agg$ID), FUN = "mean", na.rm = T)
所以我将其转换为 data.table 并运行数据表方法。
dt <- as.data.table(agg)
setkey(dt, ID)
dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID]
但几分钟后收到错误消息:
Error: cannot allocate vector of size 144 Kb
In addition: Warning messages:
1: Reached total allocation of 1535Mb: see help(memory.size)
2: Reached total allocation of 1535Mb: see help(memory.size)
不知道出了什么问题。无法使用 dt[1:5,1:5] 来查看 dt 的“头部”部分,并且 head(dt) 返回了太多穿过屋顶的行我也看不到“头部”。不知道现在该怎么办。
我可以在一列中列出 ID(如在 data.frame 中)或转置表格并在第一行中列出 ID(如在 data.table 中)。无论哪种方式,有没有更快的方法来聚合数据?非常感谢!
最佳答案
这个 :
dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID]
应该只是:
dt2 <- dt[, lapply(.SD,mean), by=ID]
dt[2:ncol(dt)]
实际上是取行的子集。一种快速学习的方法
data.table
语法是运行 example(data.table)
并在提示下完成示例。如果您搜索“# apply through columns by group”,您将准确找到这个示例。并学习
.SD
,最好的方法是搜索?data.table
对于字符串 ".SD"
然后还有一些关于.SD
的好问题和非常详细的答案。在这个 data.table 标签中,通过搜索“[data.table] .SD”返回。
关于R 行表示按组(或唯一 ID)在多列上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11007813/