假设你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)
重塑2
如果您正在寻找“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