R:从长到宽重塑,重塑列的顺序为原始列顺序
R: Reshape from long to wide, order of reshaped columns as original column order
以下是我的数据的摘录:
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
我把它从长改成了宽:
reshape(data, timevar = "rater", idvar = "id", direction = "wide")
# 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
但不是默认顺序(按 timevar
排序,即 x.1
、y.1
、x.2
、y.2
、x.3
, y.3
), 我希望顺序与列在重塑之前出现的原始顺序相同 (即, 所有 x
, 然后所有 y
; x.1
, x.2
、x.3
、y.1
、y.2
、y.3
).
我可以手动完成,但我有 100 多列要重塑。我尝试了 ?reshape
但找不到任何东西。
谢谢!
这可以通过使用 data.table
中的 dcast
来实现,它可以使用多个 value.var
library(data.table)
dcast(setDT(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
以下是我的数据的摘录:
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
我把它从长改成了宽:
reshape(data, timevar = "rater", idvar = "id", direction = "wide")
# 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
但不是默认顺序(按 timevar
排序,即 x.1
、y.1
、x.2
、y.2
、x.3
, y.3
), 我希望顺序与列在重塑之前出现的原始顺序相同 (即, 所有 x
, 然后所有 y
; x.1
, x.2
、x.3
、y.1
、y.2
、y.3
).
我可以手动完成,但我有 100 多列要重塑。我尝试了 ?reshape
但找不到任何东西。
谢谢!
这可以通过使用 data.table
中的 dcast
来实现,它可以使用多个 value.var
library(data.table)
dcast(setDT(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