按ID重新整形数据,并在R中的一行中添加属于一个人的所有值

时间:2014-02-18 16:41:07

标签: r reshape

我的数据框如下所示:

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  

因为每个人都有不同的记录数,所以新数据框的每一行都有不同的长度。我怎样才能做到这一点?

1 个答案:

答案 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