You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将数据框重构为卡方检验频数表:实操问题求助

解决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)

问题原因说明

  1. 之前输出长格式是因为没用到pivot_wider做宽格式转换;
  2. tibble子集出现所有原始分组,是因为没有明确限定仅保留当前目标基因对——函数里用complete(c1, Gene = gene_pair)强制只补全指定的两个基因,就不会出现多余分组了。

内容的提问来源于stack exchange,提问作者pleasehelp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:57:08