【问题标题】:R row means on multiple columns by groups (or unique IDs)R 行表示按组(或唯一 ID)在多列上
【发布时间】:2012-06-15 23:50:54
【问题描述】:

我有一个如下所示的数据框(20,000 行,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 中)。无论哪种方式,有没有更快的方法来聚合数据?非常感谢!

【问题讨论】:

  • 第一个问题嗯?欢迎。您真的是指data.table 包中的 data.table 吗?如果您尝试过transposeaggregate,那么最好提供您尝试过的确切命令,以便人们可以提供帮助。不知道“Data.table 方法”是什么意思。可能有一些指导方针可以在某处提出关于 Stack Overflow 的好问题(但我不能很快)。尝试 R 聊天室寻求建议。
  • 抱歉,不清楚。我已经对其进行了编辑以提供更多详细信息。希望现在更容易理解。
  • 好多了,谢谢。这使得它非常快速地回答。

标签: r aggregate data.table mean


【解决方案1】:

这个:

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",然后在这个data.table 标签中还有一些关于.SD 的好问题和非常详细的答案搜索“[data.table] .SD”。

【讨论】:

  • 谢谢马修。您的代码运行良好。我今天早上才开始研究 .SD 并运行示例。顺便说一句,有没有办法处理第一行(即转置表)上的组(即ID)数据?我问的原因是 R 似乎可以更好地处理更长的 [30,000, 3,000],而不是更宽的 [3,000, 30,000] 表格。例如,写一个很长的表需要 1 秒,但保存相同大小的转置宽表需要 5 分钟。所以我必须总是在保存之前转置表格,并在对其进行操作之前转置表格。这是“我”的独特问题吗?
  • @user1444754 很高兴它现在可以工作了。请不要忘记为我的答案投票并接受(打勾)。以便其他人知道它已解决。在此评论中,这听起来适合提出一个新问题。最好提供一个可重复的示例,响应者可以将其粘贴到新的 R 会话中以快速了解您的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多