对于数据......
library(productplots)
library(ggmosaic)
代码......
library(tidyverse)
library(broom)
我正在尝试创建整洁的chisq.test输出,以便我可以轻松过滤或可视化p值。
我正在使用“快乐”数据集(包含在上面列出的任何一个包中)
对于这个例子,如果我想在所有其他变量上调整“happy”变量,我会隔离分类变量(对于这个例子,我不会创建超出年龄,年份等的因子分组) ,然后运行一个简单的函数。
df<-happy%>%select(-year,-age,-wtssall)
lapply(df,function(x)chisq.test(happy$happy,x)
但是,我想从“扫帚”包中输出一个整洁的输出,这样我就可以创建一个p值的数据帧来过滤或可视化。
我尝试过类似下面代码的各种组合,希望能够进一步加入“整洁”的扫帚功能,或者进入“过滤器”,在这里可以缩小重要的p值,或管道进入ggplot条形图p值或chi统计数据。
df%>%summarise_if(is.factor,funs(chisq.test(.,df$happy)$p.value))
...但输出似乎不正确。如果我针对变量分别运行invidivual chisq.test,答案就不同了。
那么,有没有办法轻松地比较分类变量,在这种情况下,对所有其他列“快乐”,并返回一个整洁的数据帧进行进一步的操作和分析?
使用dplyr :: mutate,tidyr :: nest和purrr :: map的Purrr解决方案会很棒,但我觉得嵌套列表列方法不能用于chisq.test。
答案 0 :(得分:2)
您可以在tidyverse
工作流程内完成所有操作,使用map
代替lapply
。除非您要对数据进行子集化以便以某种方式(例如年龄组)比较结果,否则不需要nest
df <- happy%>%
select(-id, -year,-age,-wtssall) %>%
map(~chisq.test(.x, happy$happy)) %>%
tibble(names = names(.), data = .) %>%
mutate(stats = map(data, tidy))
unnest(df, stats)
# A tibble: 6 × 6
names data statistic p.value parameter method
<chr> <list> <dbl> <dbl> <int> <fctr>
1 happy <S3: htest> 92606.00000 0.000000e+00 4 Pearson's Chi-squared test
2 sex <S3: htest> 11.46604 3.237288e-03 2 Pearson's Chi-squared test
3 marital <S3: htest> 2695.18474 0.000000e+00 8 Pearson's Chi-squared test
4 degree <S3: htest> 659.33013 4.057952e-137 8 Pearson's Chi-squared test
5 finrela <S3: htest> 2374.24165 0.000000e+00 8 Pearson's Chi-squared test
6 health <S3: htest> 2928.62829 0.000000e+00 6 Pearson's Chi-squared test