2014-02-18 17 views
4

我有一個數據幀是這樣的:整形數據,並添加所有值都屬於一個人在一行中的R

ID V1 V2 V3 
1 1 2 3 
1 2 3 4 
1 3 4 5 
2 3 4 5 
3 4 5 6 
3 2 3 4 

我需要重塑數據幀,使所有的記錄都屬於存在於同一行 在像這樣的人:

ID V1 V2 V3 V1_2 V2_2 V3_2 V1_3 V2_3 V3_3 
1 1 2 3 2  3 4 3 4 5 
2 3 4 5 
3 4 5 6 2  3 4 

因爲每個人具有不同數目的記錄,則新數據幀將具有每行中不同的長度。我怎樣才能做到這一點?

回答

6

一種簡單的方法是使用reshape2軟件包,但必須添加輔助ID。

### The next line creates a secondary ID variable 
mydf$ID2 <- ave(mydf$ID, mydf$ID, FUN = seq_along) 

library(reshape2) 
dfL <- melt(mydf, id.vars=c("ID", "ID2")) 
dcast(dfL, ID ~ variable + ID2) 
# ID V1_1 V1_2 V1_3 V2_1 V2_2 V2_3 V3_1 V3_2 V3_3 
# 1 1 1 2 3 2 3 4 3 4 5 
# 2 2 3 NA NA 4 NA NA 5 NA NA 
# 3 3 4 2 NA 5 3 NA 6 4 NA 

可替代地,在已經加入「ID2」如上面指出的,還可以做直接與基礎R的reshape的重塑。列順序不同,但數據是相同的。

reshape(mydf, direction = "wide", idvar="ID", timevar="ID2") 
# ID V1.1 V2.1 V3.1 V1.2 V2.2 V3.2 V1.3 V2.3 V3.3 
# 1 1 1 2 3 2 3 4 3 4 5 
# 4 2 3 4 5 NA NA NA NA NA NA 
# 5 3 4 5 6 2 3 4 NA NA NA 
相關問題