将数据框重构为卡方检验频数表:实操问题求助
解决tibble数据转卡方检验所需频数表的问题
先看示例数据(真实数据为tibble,这里转成tibble模拟):
library(tidyverse) df1 <- tibble( Gene = c("A", "A", "A", "A", "B", "B", "B", "C", "D", "D", "E"), c1 = c(2, 2, 2, 3, 3, 3, 3, 4, 2, 4, 5) )
你的需求是:分别生成A+B、A+C、A+D、A+E的子集,再将每个子集转换为以c1值为行名,Gene分组为列,对应值为出现频数的宽格式表(比如A+B子集的目标格式):
A B 2 3 0 3 1 3
针对你遇到的「输出长格式、tibble子集仍显示所有原始分组」的问题,直接用下面的函数就能解决,不管是dataframe还是tibble都适用:
# 定义生成目标频数表的函数 create_freq_table <- function(data, gene_pair) { data %>% # 过滤出当前基因对的子集 filter(Gene %in% gene_pair) %>% # 按c1和Gene分组统计频数 count(c1, Gene, name = "freq") %>% # 补全所有c1与目标基因的组合,缺失的频数填0 complete(c1, Gene = gene_pair, fill = list(freq = 0)) %>% # 转成宽格式 pivot_wider(names_from = Gene, values_from = freq) %>% # 将c1列设为行名 column_to_rownames("c1") }
调用函数生成各个基因对的频数表:
# 生成A+B的频数表 ab_table <- create_freq_table(df1, c("A", "B")) # 生成A+C的频数表 ac_table <- create_freq_table(df1, c("A", "C")) # 生成A+D的频数表 ad_table <- create_freq_table(df1, c("A", "D")) # 生成A+E的频数表 ae_table <- create_freq_table(df1, c("A", "E"))
查看A+B的结果,完全符合要求:
> ab_table A B 2 3 0 3 1 3
生成的表可以直接用于卡方检验:
chisq.test(ab_table)
问题原因说明
- 之前输出长格式是因为没用到
pivot_wider做宽格式转换; - tibble子集出现所有原始分组,是因为没有明确限定仅保留当前目标基因对——函数里用
complete(c1, Gene = gene_pair)强制只补全指定的两个基因,就不会出现多余分组了。
内容的提问来源于stack exchange,提问作者pleasehelp
相关产品推荐
相关产品推荐

