質問
私は次のようなデータ構造を持っています:
groupA1 groupA2 groupB1 groupB2 date text
0 1 1 1 2013-01-01 the dog
.
各groupB
変数では、値1の列の1行を1行一覧表示します。
1つの行に存在するgroupA
とgroupB
のすべての組み合わせを一覧表示する必要がありますが、その行の列としてそれらの組み合わせのそれぞれに日付とテキストを追加する必要があります。
変換データは次のように表示されます。
var_groupB var_groupA date text
groupB1 groupA2 2013-01-01 the dog
groupB2 groupA2 2013-01-01 the dog
.
melt
とddply
の組み合わせを試しましたが、必要な変数の1つがなくても常に残しています。
私が試したことのあるものはmelt(x, id.vars=c("text", "date"))
であったが、groupA
とgroupB
の関係に関するすべての情報を失います。
私はMessyループを使ってこれを達成することができましたが、reshape
ユーティリティが気付いていないことが存在し、ジョブを実行できるかどうかはわかりませんでした。
解決
グループごとに1回、2回melt
を作成できます。
y <- melt(x, measure.vars=c("groupA1", "groupA2"),
variable.name="var_groupA", value.name="val_groupA")
y <- melt(y, measure.vars=c("groupB1", "groupB2"),
variable.name="var_groupB", value.name="val_groupB")
.
AとB:
の組み合わせごとに1行表示する date text var_groupA val_groupA var_groupB val_groupB
1 2013-01-01 the dog groupA1 0 groupB1 1
2 2013-01-01 the dog groupA2 1 groupB1 1
3 2013-01-01 the dog groupA1 0 groupB2 1
4 2013-01-01 the dog groupA2 1 groupB2 1
.
次にこれをサブセットして値列を削除することができます。
y <- y[y$val_groupA == 1 & y$val_groupB==1, ]
y <- y[, c("var_groupA", "var_groupB", "date", "text")]
.
あなたにあなたが欲しいものを与えるもの:
var_groupA var_groupB date text
2 groupA2 groupB1 2013-01-01 the dog
4 groupA2 groupB2 2013-01-01 the dog
.
もちろん、あなたのデータセットがあなたの例よりも複雑であるならば、あなたはより自動化されたファッションの溶融とサブセットを行うことによってこの解決策をよりエレガントにすることができます - 例えば、グループ列の検出とmeasure.vars
、variable.name
の充填、そしてvalue.name
は自動的に、おそらく任意の数のグループのために。
他のヒント
最初の2つのステートメントは、最初の4列の各0を ""、各1に列名を与える列名を、dd2
に置き換えます。次の2つのステートメントでは、groupA
を使用して、groupB
を使用してexpand.grid
とdd3
のすべての組み合わせを生成します。最後にsubset
エントリのない行にそれを""
:
newvals <- function(nm) ifelse(dd[[nm]] == 0, "", nm)
dd2 <- replace(dd, 1:4, lapply(names(dd)[1:4], newvals))
combo <- function(x) data.frame(expand.grid(groupA=c(x[1:2]), groupB=c(x[3:4])),
x$date, x$text)
dd3 <- do.call("rbind", by(dd2, 1:nrow(dd2), combo))
subset(dd3, groupA != "" & groupB != "")
.
これは:
groupA groupB x.date x.text
1.2 groupA2 groupB1 2013-01-01 the dog
1.4 groupA2 groupB2 2013-01-01 the dog
.