首页 文章

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

提问于
浏览
10

我有一个如下数据框(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”部分,而head(dt)返回太多穿过屋顶的线条我也看不到“头部” . 不知道现在该做什么 .

我可以将ID列在一列中(如data.frame中)或转置表并列出第一行中的ID(如data.table中所示) . 无论哪种方式,是否有更快的方式来聚合数据?非常感谢!

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) 并在提示符处完成示例 . 如果你搜索"# applying through columns by group",你会发现这个例子 .

    要学习 .SD ,最好的方法是在 ?data.table 中搜索字符串 ".SD" ,然后在这个data.table标签中有一些关于 .SD 的好问题和非常详细的答案,它们由搜索"[data.table] .SD"返回 .

相关问题