我正在尝试在dplyr框架中的几个组上进行卡方检验。问题是,group_by() %>% summarise()
似乎没有做法。
模拟数据(与有问题的数据结构相同,但随机,因此p值应该很高)
set.seed(1)
data.frame(partido=sample(c("PRI", "PAN"), 100, 0.6),
genero=sample(c("H", "M"), 100, 0.7),
GM=sample(c("Bajo", "Muy bajo"), 100, 0.8)) -> foo
我想比较GM定义的几个组,看看partido和genero的交叉表的p.values是否有变化,以GM为条件。
明显的dplyr方式应该是:
foo %>%
group_by(GM) %>%
summarise(pvalue=chisq.test(.$partido, .$genero)$p.value) #just the p.value, so summarise is happy
但是我得到了未分组数据的p.values,只是时间,而不是每个表的p.value:
# A tibble: 2 × 2
GM pvalue
<fctr> <dbl>
1 Bajo 0.8660521
2 Muy bajo 0.8660521
使用过滤器测试每个组我得到:
foo %>%
filter(GM=="Bajo") %$%
table(partido, genero) %>%
chisq.test()
返回:X-squared = 0.015655, df = 1, p-value = 0.9004
foo %>%
filter(GM=="Muy bajo") %$%
table(partido, genero) %>% chisq.test()
返回:X-squared = 0.50409, df = 1, p-value = 0.4777
dplyr:summarise()
适用于具有多个参数的函数,因此这不应该是问题:
data.frame(a=1:10, b=10:1, c=sample(c("Grupo 1", "Grupo 2"), 10, 0.5)) %>%
group_by(c) %>%
summarise(r=cor(a, b))
就像魅力一样。它似乎与chisq.test无关。
我设法使用tidyr::nest()
和purrr::map()
获得了我想要的嵌套模型,但我发现代码很麻烦 - 至少对我的学生来说。实际上,我已经投入了很多我们教他们(一个非常数学和编程挑战的小组)dplyr所以他们可以尽可能地避免矢量函数。
foo %>%
nest(-GM) %>%
mutate(tabla=map(data, ~table(.))) %>%
mutate(pvalue=map(tabla, ~chisq.test(.)$p.value)) %>%
select(GM, pvalue) %>%
unnest()
A tibble: 2 × 2
GM pvalue
<fctr> <dbl>
1 Bajo 0.9004276
2 Muy bajo 0.4777095
do()
也可以解决问题:
foo %>%
group_by(GM) %>%
do(tidy(chisq.test(.$partido, .$genero)))
Source: local data frame [2 x 5]
Groups: GM [2]
GM statistic p.value parameter
<fctr> <dbl> <dbl> <int>
1 Bajo 0.0156553 0.9004276 1
2 Muy bajo 0.5040878 0.4777095 1
# ... with 1 more variables: method <fctr>
如:Fisher's and Pearson's test for indepedence
但是,¿group_by()
为什么不与summarise(chisq.test()$p.value)
合作?
答案 0 :(得分:5)
在dplyr
中,您通常可以使用不带引号的变量名来访问相关列,无论您是在groupby还是其他方面。因此,删除.$
和.$partido
中不需要的.$genero
访问者:
foo %>%
group_by(GM) %>%
summarise(pvalue= chisq.test(partido, genero)$p.value)
# A tibble: 2 × 2
GM pvalue
<fctr> <dbl>
1 Bajo 0.9004276
2 Muy bajo 0.4777095