2015-10-30 48 views
2

假設數據這樣的數擴大列拼合行,每個ID的多個行:通過根據每個ID的行

z <- data.frame(ID = c(1,1,1,2,2,3,4,4),VA=c(1,2,3,1,2,5,7,8),VB=c("a","b","c","a","b","c","b","c"),VC=c(1,2,3,1,2,8,10,12)) 

ID VA VB VC 
1 1 a 1 
1 2 b 2 
1 3 c 3 
2 1 a 1 
2 2 b 2 
3 5 c 8 
4 7 b 10 
4 8 c 12 

我想塌陷到每個ID 1行,以儘可能多的列我需要支持任何Id中存在的最大數量的原始行; (在本實施例3點的行爲ID = 1):

ID VA1 VA2 VA3 VB1 VB2 VB3 VC 
1 1  2  3  a  b  c  2.0 
2 1  2  a  b  NA NA  1.5 
3 5  NA NA c  NA NA  8.0 
4 7  8  NA b  c  NA 15.0 

另外,還要注意如何一些列(VA,VB)可被 「展平」 和其他人(VC)可以被聚集。

我不想將任何單元格的值轉換爲列名稱,因爲這些值可能變化過大。但是任何給定ID的行數都會很小,所以我認爲這將是一個理想的展平方法。

+1

正確的 - 感謝 – johnjps111

回答

4

我們可以從data.table使用dcast。我們將'data.frame'轉換爲'data.table'(setDT(z)),將'VC'列轉換爲numeric類,將值替換爲'VC'的mean'ID',然後使用dcast多個value.var列。在devel版本中,可以使用rowid創建序列列。否則,我們可能不得不這樣做z[, N:= 1:.N, by = ID]然後用dcast(z, ID+VC~N, value.var= c('VA', 'VB'), sep='')

library(data.table)#v1.9.7+ 
setDT(z)[, VC:= as.numeric(VC)][, VC:= mean(VC), by = ID] 
dcast(z, ID+VC~rowid(ID), value.var=c('VA', 'VB'), sep='') 
# ID VC VA1 VA2 VA3 VB1 VB2 VB3 
#1: 1 2.0 1 2 3 a b c 
#2: 2 1.5 1 2 NA a b NA 
#3: 3 8.0 5 NA NA c NA NA 
#4: 4 11.0 7 8 NA b c NA 
+0

這將如何知道蔓延'VA'和聚集'VC'? –

+0

感謝您的快速響應!看起來很棒,但rowid似乎對我無效。我在R 3.2.2上,它說1.9.6是data.table的最新版本; (在Windows上)。 – johnjps111

+1

@JohnnyStrings正如我在描述中提到的,你不需要'rowid'。使用'1.9.6',序列列可以通過'df1 [,N:= 1:.N,by = ID]' – akrun