从长到宽投射时指定列顺序

时间:2019-06-03 16:16:52

标签: r reshape2

我想使用reshape2将表格转换为宽格式。我希望列在vars上排序,如下所示:

data <- as.data.frame(matrix(c(rep(1,3),rep(2,3),rep(1:3,2),rep(0:2,4)),6,4))
colnames(data) <- c("id", "rater", "x", "y")
print(data)

#   id rater x y
# 1  1     1 0 0
# 2  1     2 1 1
# 3  1     3 2 2
# 4  2     1 0 0
# 5  2     2 1 1
# 6  2     3 2 2

要这样投射:

# Result:
#   id x.1 y.1 x.2 y.2 x.3 y.3
# 1  1   0   0   1   1   2   2
# 4  2   0   0   1   1   2   2
对于每个样本,

x后跟y。

现在我正在使用dcast并获得以下输出:

dcast(as.data.table(data), id~rater, value.var=c("x", "y"), sep=".")
#   id x.1 x.2 x.3 y.1 y.2 y.3
#1:  1   0   1   2   0   1   2
#2:  2   0   1   2   0   1   2

但是我希望它是x.1, y.1, x.2, y.2等。

我可以通过整形(原始)来完成此操作,但是它对我的数据花费的时间太长(超过50万行,每个表15分钟以上,加上20 + GB内存)

reshape(data, idvar = id, timevar = "rater", direction = "wide") 

谢谢!

1 个答案:

答案 0 :(得分:2)

一个选项是提取列名order

的数字部分
out <- dcast(as.data.table(data), id~rater, value.var=c("x", "y"), sep=".")
setcolorder(out,  c(1, order(as.numeric(gsub("\\D+", "", names(out)[-1])))+1))
out
#   id x.1 y.1 x.2 y.2 x.3 y.3
#1:  1   0   0   1   1   2   2
#2:  2   0   0   1   1   2   2