2012-06-13 46 views
9

我有一个像下面的数据框(20,000行49列)。每行具有唯一的名称(ID),每个ID在3列中有3个重复读数(例如D15C D15C.1 D15C.2)。名称的前4个字母(“D15C”)是组名。我需要通过组名来平均列(例如平均D15C,D15C.1和D15.2以获得D15C),因此最终表将从49列合并为16列。R行意味着在多个列按组(或唯一ID)

  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)返回了太多穿过屋顶的线,我也看不到“head”。不知道现在该做什么。

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

+0

第一个问题诶?欢迎。你真的认为'data.table'包中的data.table?如果你尝试过'转置'和'聚合',那么最好提供你尝试的确切命令,以便人们可以提供帮助。不明白'Data.table method'是什么意思。在某处可能会提出一些关于Stack Overflow的问题的指导方针(但我不能很快)。试试R聊天室寻求建议。 –

+0

对不起,不清楚。我编辑它以提供更多细节。希望现在更容易理解。 – user1444754

+0

好多了,谢谢。这使得它很快回答。 –

回答

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),并在提示符下运行示例。如果您搜索“#通过组按列应用”,您会发现这个例子。

,并了解.SD,最好的办法是寻找?data.table的字符串".SD",然后也有大约.SD在此data.table标签,它是通过搜索返回的一些很好的问题,很详细的解答“[data.table ] .SD“。

+0

谢谢马修。你的代码工作得很好。我刚开始研究SD,并在今天上午运行这些示例。顺便说一下,有没有办法在第一行(即转置表)上用组(即ID)处理数据?我问的原因是R似乎更好地处理更长的[30,000,3,000],而不是更宽的[3,000,3,000]。例如,write.table需要1秒,但是5分钟可以保存相同大小的转置宽表。所以我必须在保存之前总是转置表格,并在对其进行操作之前对表格进行转置。这是“我的”独特的问题吗? – user1444754

+1

@ user1444754现在很高兴它的作品。不要忘记投票给我的答案,并接受它(请勾选)。让别人知道它已经解决了。在这个评论中,这听起来适合一个新的问题。最好提供一个可重复使用的示例,快速响应者可以将其粘贴到新的R会话中,以查看您的意思。 –