我正在尝试将展览A中此表格中的数据重新整形为展览B中的表格。我已经尝试过对每三列数据进行整形和循环并附加数据集,但无法完全实现。我怎样才能重塑这个?
A AFG1 AFG2 AFG3 US1 US2 US3 t
5 7 9 3 4 5 1980
6 8 10 4 6 5 2000
B 1 2 3 t xtry
5 7 9 1980 AFG
6 8 10 2000 AFG
3 4 5 1980 US
4 6 5 2000 US
答案 0 :(得分:4)
假设您的data.frame
被称为“mydf”,请尝试:
reshape(mydf, direction = "long",
idvar = "t",
varying = 1:6,
v.names = c("1", "2", "3"),
times = c("AFG", "US"),
timevar = "xtry")
# t xtry 1 2 3
# 1980.AFG 1980 AFG 5 7 9
# 2000.AFG 2000 AFG 6 8 10
# 1980.US 1980 US 3 4 5
# 2000.US 2000 US 4 6 5
对于你的问题,你的参数必须比直截了当的reshape
问题更冗长,因为你的变量的命名与R期望的不同(以1.AFG
的形式, 2.AFG
,等等。)
例如:
mydf2 <- mydf
names(mydf2) <- gsub("([A-Z]+)([0-9]+)", "\\2\\.\\1", names(mydf2))
如果您的名字如下所示:
names(mydf2)
# [1] "1.AFG" "2.AFG" "3.AFG" "1.US" "2.US" "3.US" "t"
reshape
命令更直接。
reshape(mydf2, direction = "long", idvar = "t",
timevar = "xtry", varying = 1:6)
如果你正在寻找一个“reshape2”解决方案,我实际上发现它比使用基础R的reshape
函数(通常是另一种方式)更多的工作。这就是我想出的:
首先,melt
数据集。
library(reshape2)
mydf_m <- melt(mydf, id.vars="t")
head(mydf_m)
# t variable value
# 1 1980 AFG1 5
# 2 2000 AFG1 6
# 3 1980 AFG2 7
# 4 2000 AFG2 8
# 5 1980 AFG3 9
# 6 2000 AFG3 10
“变量”列对我们目前的形式来说是无用的,所以让我们解决它。
mydf_m <- cbind(mydf_m,
colsplit(gsub("([A-Z]+)([0-9]+)",
"\\1_\\2", mydf_m$variable),
"_", c("xtry", "var")))
以下是现在数据的样子。
head(mydf_m)
# t variable value xtry var
# 1 1980 AFG1 5 AFG 1
# 2 2000 AFG1 6 AFG 1
# 3 1980 AFG2 7 AFG 2
# 4 2000 AFG2 8 AFG 2
# 5 1980 AFG3 9 AFG 3
# 6 2000 AFG3 10 AFG 3
现在很简单。
dcast(mydf_m, t + xtry ~ var)
# t xtry 1 2 3
# 1 1980 AFG 5 7 9
# 2 1980 US 3 4 5
# 3 2000 AFG 6 8 10
# 4 2000 US 4 6 5