0

次のようなデータ構造があります。

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

変数ごとgroupBに、値が 1 の列ごとに 1 つの行をリストしたいと思います。1が存在するgroupAとのすべての組み合わせをgroupB1 つの行にリストする必要がありますが、それらの組み合わせのそれぞれに日付とテキストを次のように追加する必要があります。その行の列。

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

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

meltと の組み合わせを試してみましddplyたが、常に必要な変数の 1 つがありません。

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

乱雑なループを使用してこれを達成することはできましたがreshape、私が知らないユーティリティが存在するかどうかはわかりませんでした。

4

2 に答える 2

5

meltグループごとに 1 回、2 回行うことができます。

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.namevalue.name

于 2014-06-03T22:22:40.863 に答える
2

最初の 2 つのステートメントは、最初の 4 列の各 0 を "" に置き換え、各 1 を を与える列名に置き換えますdd2。次の 2 つのステートメントは、を使用して各行に対してgroupAとのすべての組み合わせを生成し、結果は になります。最後に 、エントリのない行に:groupBexpand.griddd3subset""

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
于 2014-06-03T23:05:26.457 に答える