これは、データを「ワイド」フォーマットから「ロング」フォーマットに「再形成」することとして知られています。ベースRでは、1つのツールは ですがreshape
、最初に「id」変数が必要です:
reshape(df, direction = "long", varying = names(df), sep = "_")
# time A B id
# 1.1 1 1 10 1
# 2.1 1 2 11 2
# 3.1 1 3 12 3
# 1.2 2 4 13 1
# 2.2 2 5 14 2
# 3.2 2 6 15 3
# 1.3 3 7 16 1
# 2.3 3 8 17 2
# 3.3 3 9 18 3
必要に応じて、他の列を削除できます。
楽しみのために、「reshape2」パッケージを使用した別のアプローチを次に示します (元のサンプル データから始めます)。
library(reshape2)
dfL <- melt(as.matrix(df))
dfL <- cbind(dfL, colsplit(dfL$Var2, "_", c("Factor", "Individual")))
dcast(dfL, Individual + Var1 ~ Factor, value.var="value")
# Individual Var1 A B
# 1 1 1 1 10
# 2 1 2 2 11
# 3 1 3 3 12
# 4 2 1 4 13
# 5 2 2 5 14
# 6 2 3 6 15
# 7 3 1 7 16
# 8 3 2 8 17
# 9 3 3 9 18
あなたが最先端に住んでいるなら、「data.table」バージョン 1.8.11 は「melt」と「dcast」を実装しました。まだあまり遊んでいませんが、とても簡単です。ここでも、これまでに提供したすべてのソリューションと同様に、「id」が必要です。
library(reshape2)
library(data.table)
packageVersion("data.table") ## Must be at least 1.8.11 to work
# [1] ‘1.8.11’
DT <- data.table(cbind(id = sequence(nrow(df)), df))
DTL <- melt(DT, id.vars="id")
DTL[, c("Fac", "Ind") := colsplit(variable, "_", c("Fac", "Ind"))]
dcast.data.table(DTL, Ind + id ~ Fac)
# Ind id A B
# 1: 1 1 1 10
# 2: 1 2 2 11
# 3: 1 3 3 12
# 4: 2 1 4 13
# 5: 2 2 5 14
# 6: 2 3 6 15
# 7: 3 1 7 16
# 8: 3 2 8 17
# 9: 3 3 9 18
アップデート
別のオプションはmerged.stack
、私の「splitstackshape」パッケージから使用することです。も使用するとうまく機能します。これにより、「data.table」アプローチas.data.table(df, keep.rownames = TRUE)
のステップと同等のものが作成されます。data.table(cbind(id = sequence(nrow(df)), df))
library(splitstackshape)
merged.stack(as.data.table(df, keep.rownames = TRUE),
var.stubs = c("A", "B"), sep = "_")
# rn .time_1 A B
# 1: 1 1 1 10
# 2: 1 2 4 13
# 3: 1 3 7 16
# 4: 2 1 2 11
# 5: 2 2 5 14
# 6: 2 3 8 17
# 7: 3 1 3 12
# 8: 3 2 6 15
# 9: 3 3 9 18
公平性/完全性のために、「tidyr」+「dplyr」を使用したアプローチを次に示します。
library(tidyr)
library(dplyr)
df %>%
gather(var, value, A_1:B_3) %>%
separate(var, c("var", "time")) %>%
group_by(var, time) %>%
mutate(grp = sequence(n())) %>%
ungroup() %>%
spread(var, value)
# Source: local data frame [9 x 4]
#
# time grp A B
# 1 1 1 1 10
# 2 1 2 2 11
# 3 1 3 3 12
# 4 2 1 4 13
# 5 2 2 5 14
# 6 2 3 6 15
# 7 3 1 7 16
# 8 3 2 8 17
# 9 3 3 9 18