R 指定从长到宽转换时的列顺序

R 指定从长到宽转换时的列顺序,r,reshape2,R,Reshape2,我想使用Reforme2将表格转换为宽格式。我希望列在vars ie上的顺序如下: 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

我想使用Reforme2将表格转换为宽格式。我希望列在vars ie上的顺序如下:

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
对于每个样品,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
等等

我可以通过重塑(原始)来实现这一点,但它对我的数据占用的时间太长(超过500k行,每个表15分钟以上,加上20+GB的内存)


谢谢

一个选项是提取列名的数字部分,
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

out我在实际数据集上尝试了这一点,得到了这个错误:
setcolorder中的错误(test5,c(1,order(sub(“\\D+”,“”,names(test5))[-1]))+:neworder包含重复项
@Blaze9您能检查列名吗?它与示例有何不同谢谢您的帮助!列名在我的数据中更长:x/y实际上是
groupmax
groupmin
@Blaze9
sub(\\D+,“”),names(out)[-1]的输出是什么
并将其更改为
gsub
嘿,Akrun。非常感谢!这对只有一个ID列的df非常有用。如果我有3个ID列,您能帮我得到类似的东西吗?前3列保持静态?
id1、id2、id3、x1、y1、x2、y2、x3、y3…
reshape(data, idvar = id, timevar = "rater", direction = "wide") 
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