如何将带频数的DataFrame转换为卡方检验用频数表(dplyr管道实现)
用dplyr管道转换DataFrame适配卡方检验
问题背景
我有如下结构的DataFrame:
structure(list(health_pa = c(0, 0, 1, 1), matt_ne = c("matt_ne", "total", "matt_ne", "total"), n = c(425L, 1227L, 14L, 58L)), class = c("rowwise_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L), groups = structure(list( .rows = structure(list(1L, 2L, 3L, 4L), ptype = integer(0), class = c("vctrs_list_of", "vctrs_vctr", "list"))), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))
需要将其转换为以下宽格式表格,用于卡方检验:
| matt_ne | total | |
|---|---|---|
| 0 | 425 | 1227 |
| 1 | 14 | 58 |
请问能否通过dplyr管道实现该转换?
解决方案
完全可以用dplyr管道实现,核心是用tidyr::pivot_wider()函数重塑数据,同时需要先解除原数据的行分组状态:
library(dplyr) library(tidyr) # 假设原数据框名为df df %>% ungroup() %>% # 解除行分组,避免pivot_wider报错 pivot_wider( id_cols = health_pa, # 指定作为行标识的列 names_from = matt_ne, # 指定转为列名的字段 values_from = n # 指定填充单元格的数值 ) %>% rename(` ` = health_pa) # 将行标识列名改为空,匹配目标表格格式
关键步骤说明:
ungroup():原数据是rowwise_df(行分组状态),必须先解除分组才能正常执行宽表转换pivot_wider():这是tidyr中专门用于长转宽的函数,完美匹配需求中的结构转换rename():可选步骤,如果需要和目标表格的行标题完全一致,将health_pa列名改为空字符串即可
转换后的表格可以直接传入chisq.test()进行卡方检验。
内容的提问来源于stack exchange,提问作者Ryan Gary
相关产品推荐
相关产品推荐

