11

我有一个如下所示的数据框(20,000 行 x 49 列)。每行都有一个唯一的名称 (ID),每个 ID 在 3 列中有 3 个重复读数(例如 D15C D15C.1 D15C.2)。列名的前 4 个字母(“D15C”)是组名。我需要按组名对列进行平均(例如平均 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张这样的桌子在等……

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 中)。无论哪种方式,有没有更快的方法来聚合数据?非常感谢!

4

1 回答 1

12

这 :

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”,您会找到这个示例。

And to learn .SD, best way is to search ?data.table for the string ".SD" and then also there are some good questions and very detailed answers about .SD in this data.table tag which are returned by a search "[data.table] .SD".

于 2012-06-14T15:17:13.003 回答