我对正在执行卡方检验的数据进行了分组,并希望返回一个汇总表,该表包含来自htest
对象的多个值。例如(from a previous question)
library(dplyr)
set.seed(1)
foo <- 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 %>%
group_by(GM) %>%
summarise(p.value=chisq.test(partido, genero)$p.value))
返回p值,但我希望来自p.value
对象的多个值(例如statistic
和htest
)作为摘要表中的不同列返回。 / p>
我尝试过
foo %>%
group_by(GM) %>%
summarise(htest=chisq.test(partido, genero)) %>%
mutate(p.value=htest$p.value, statistic=htest$statistic)
但这会引发错误
summarise_impl(.data,点)中的错误:
htest
列的长度必须为1(汇总值),而不是9
如何使用tidyverse工具完成此任务?
答案 0 :(得分:4)
另一种选择是利用broom::tidy
library(broom)
library(tidyverse)
foo %>%
group_by(GM) %>%
nest() %>%
transmute(
GM,
res = map(data, ~tidy(chisq.test(.x$partido, .x$genero)))) %>%
unnest()
## A tibble: 2 x 5
# GM statistic p.value parameter method
# <fct> <dbl> <dbl> <int> <chr>
#1 Bajo 0.0157 0.900 1 Pearson's Chi-squared test with Yates' c…
#2 Muy ba… 0.504 0.478 1 Pearson's Chi-squared test with Yates' c…
答案 1 :(得分:1)
一种方法是按组(nest
)GM
收集数据,然后使用map
从每个组获取不同的值。
library(tidyverse)
foo %>%
group_by(GM) %>%
nest(partido, genero) %>%
ungroup() %>%
mutate(p.value = map_dbl(data, ~ chisq.test(.$partido,.$genero)$p.value),
statistic = map_dbl(data, ~ chisq.test(.$partido,.$genero)$statistic)) %>%
select(-data)
# GM p.value statistic
# <fct> <dbl> <dbl>
#1 Bajo 0.900 0.0157
#2 Muy bajo 0.478 0.504
或者,如果我们只想运行一次测试,则可以将对象存储在一个变量中,然后提取感兴趣的值。
foo %>%
group_by(GM) %>%
nest(partido, genero) %>%
ungroup() %>%
mutate(obj = map(data, ~ chisq.test(.$partido,.$genero)),
p.value = map_dbl(obj, ~ .$p.value),
statistic = map_dbl(obj, ~ .$statistic)) %>%
select(-data, -obj)