2012-06-13 83 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會話中,以查看您的意思。 –