あなた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
あなたの問題については、変数の名前がRが期待するもの(、、などの形式)とは異なるため、単純な問題よりも引数を少し冗長にする必要がありreshape
ます。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
「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