R:如果列的顺序不正确,reshape()会混淆数据;虫子?

时间:2018-08-27 20:30:49

标签: r reshape

从宽格式转换为长格式时,如果变量的顺序不正确,R中的reshape()函数将混合值。一个例子:

df <- data.frame(Id=c(1,2),
             x.2000 = c(15,13),x.2001=c(21,61),x.2002=c(37,11),
             y.2002=c(14,58),y.2000=c(20,18),y.2001=c(9,73))

产生

  Id x.2000 x.2001 x.2002 y.2002 y.2000 y.2001
1  1     15     21     37     14     20      9
2  2     13     61     11     58     18     73

请注意,y变量的时间顺序不正确。应用reshape(),按ID排序,并用

重命名行
df.long <- reshape(df,idvar = "Id", 
               timevar = "year", 
               times=seq(2000,2002),
               varying=names(df)[-1],
               direction="long")
df.long <- df.long[order(df.long[,"Id"]),]
rownames(df.long) <- 1:nrow(df.long)

给予

Id year  x  y
1  1 2000 15 14
2  1 2001 21 20
3  1 2002 37  9
4  2 2000 13 58
5  2 2001 61 18
6  2 2002 11 73

在没有警告的情况下,R在2000年写下了y的2002值,在2001年写下了2000的值,依此类推。有没有办法纠正这个错误?

1 个答案:

答案 0 :(得分:1)

一种选择是根据“年份”以正确的顺序order {}

i1 <- c(1 , 1+ order(as.numeric(sub(".*\\.", "", names(df)[-1]))))
df <- df[i1]

reshape与数据集上的OP代码结合在一起

df.long
#  Id year  x  y
#1  1 2000 15 20
#2  1 2001 21  9
#3  1 2002 37 14
#4  2 2000 13 18
#5  2 2001 61 73
#6  2 2002 11 58

或者代替对数据列进行排序,而更改varying

中的顺序
i2 <- match(sub(".*\\.", "", names(df)[-1]), 2000:2002)
reshape(df, idvar = "Id", timevar = "year", times = 2000:2002, 
       varying = names(df)[-1][order(i2)], direction = "long")