我正在学习 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
这似乎是部分解决方案。