質問

私は次のようなデータ構造を持っています:

 groupA1    groupA2    groupB1    groupB2    date        text
     0         1          1          1      2013-01-01   the dog
.

groupB変数では、値1の列の1行を1行一覧表示します。 1つの行に存在するgroupAgroupBのすべての組み合わせを一覧表示する必要がありますが、その行の列としてそれらの組み合わせのそれぞれに日付とテキストを追加する必要があります。

変換データは次のように表示されます。

var_groupB  var_groupA  date         text
 groupB1    groupA2     2013-01-01    the dog
 groupB2    groupA2     2013-01-01    the dog
.

meltddplyの組み合わせを試しましたが、必要な変数の1つがなくても常に残しています。

私が試したことのあるものはmelt(x, id.vars=c("text", "date"))であったが、groupAgroupBの関係に関するすべての情報を失います。

私は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.varsvariable.nameの充填、そしてvalue.nameは自動的に、おそらく任意の数のグループのために。

他のヒント

最初の2つのステートメントは、最初の4列の各0を ""、各1に列名を与える列名を、dd2に置き換えます。次の2つのステートメントでは、groupAを使用して、groupBを使用してexpand.griddd3のすべての組み合わせを生成します。最後に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
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top