Я изучаю dplyr, выйдя из plyr, и я хочу генерировать (для каждой группы) столбцы (за взаимодействие) из вывода 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
Это похоже на частичное решение.