Я изучаю 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
Это похоже на частичное решение.