12

plyr から来た dplyr を学習しています。xtabs の出力から (グループごとに) 列を (相互作用ごとに) 生成したいと考えています。

短い要約:私は得ています

A    B
1    NA
NA   2

欲しかった時

A    B
1    2

xtabs データは次のようになります。

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T)))
       A
P       FALSE TRUE
  FALSE     1    2
  TRUE      1    1

次のようdo(に、データフレーム内のデータが必要になりました。

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% as.data.frame
      P     A Freq
1 FALSE FALSE    1
2  TRUE FALSE    1
3 FALSE  TRUE    2
4  TRUE  TRUE    1

ここで、列がレベルの相互作用である単一行の出力が必要です。これが私が探しているものです:

FALSE_FALSE TRUE_TRUE FALSE_TRUE TRUE_FALSE
          1         1          2          1

しかし、代わりに私は得る

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% 
    as.data.frame %>% 
    unite(S,A,P) %>% 
    spread(S,Freq)
  FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE
1           1         NA         NA        NA
2          NA          1         NA        NA
3          NA         NA          2        NA
4          NA         NA         NA         1

私は明らかにここで何かを誤解しています。ここでreshape2のコードに相当するものを探しています(一貫性のためにmagrittrパイプを使用しています):

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% 
    as.data.frame %>% # can be omitted. (safely??)
    melt %>% 
    mutate(S=interaction(P,A),value=value) %>% 
    dcast(NA~S)
Using P, A as id variables
  NA FALSE.FALSE TRUE.FALSE FALSE.TRUE TRUE.TRUE
1 NA           1          1          2         1

(この単純化された例にはグループ化変数がないため、ここでは NA が使用されていることに注意してください)


更新-興味深いことに、単一のグループ化列を追加するとこれが修正されるようです-なぜ、私に言わずにグループ化列を(おそらくrow_nameから)合成するのですか?

> xtabs(data=data.frame(h="foo",P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% 
  as.data.frame %>% 
  unite(S,A,P) %>% 
  spread(S,Freq)
    h FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE
1 foo           1          1          2         1

これは部分的な解決策のようです。

4

1 に答える 1