我的数据框如下所示:
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
因为每个人都有不同的记录数,所以新数据框的每一行都有不同的长度。我怎样才能做到这一点?
答案 0 :(得分: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