R 行表示按组(或唯一 ID)在多列上

标签 r aggregate data.table mean

我有一个如下所示的数据框(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/

相关文章:

r - 基于另一列在 DF 上创建迭代器

r - 将列表的多个元素转换为矩阵 R

r - 如何使用密码解压.rar?

sql服务器: How to use an aggregate function like MAX in a WHERE clause

r - 在data.table中聚合时如何查看多个 `by`中逗号分隔字符串背后的逻辑?

R:键应该在 data.table 中以这种方式运行吗?

r - 在 R Plotly 中命名 3D 曲面图的图例

r - 加入两个不完整的 data.tables 具有相同的列名

r - 为因子的每个水平附加一行总和

sql - 将聚合运算符从 SQL 转换为关系代数