从宽格式转换为长格式时,如果变量的顺序不正确,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的值,依此类推。有没有办法纠正这个错误?
答案 0 :(得分:1)
一种选择是根据“年份”以正确的顺序order
{1>}
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")