使用dplyr创建多行汇总表:植物基因型-环境数据分组需求
用dplyr实现植物基因型-环境观测数据的多行/多维度汇总
没问题!我来一步步教你用dplyr搞定这个植物基因型-环境的汇总表,完全适配你的多观测场景~
首先先补全你的示例数据(给你加了一个模拟的性状列,让后续汇总更贴近实际需求):
library(tibble) library(dplyr) library(tidyr) # 用到宽转窄/窄转宽时需要 # 生成符合要求的示例数据 nObs <- 500 data <- tibble( Gt = sample(sprintf("%02d", 1:20), nObs, replace = TRUE), Env = sample(LETTERS[1:8], nObs, replace = TRUE), PlantHeight = rnorm(nObs, mean = 150, sd = 10) # 模拟一个测量性状,可选 )
接下来根据不同的汇总需求,给你三种常用的实现方式:
方式1:紧凑式单基因型一行汇总
适合快速查看每个基因型的整体环境覆盖情况,包含总观测数、涉及环境列表、各环境观测频次:
compact_summary <- data %>% group_by(Gt) %>% summarise( 总观测数 = n(), 涉及环境列表 = paste(unique(Env), collapse = ", "), # 拼接所有出现过的环境 各环境观测次数 = list(table(Env)) # 用列表存储详细的环境频次表 ) %>% ungroup() # 查看前6条结果 head(compact_summary)
说明:list(table(Env))会保留每个环境的具体观测次数,你可以通过compact_summary$各环境观测次数[[1]]查看第一个基因型的环境频次明细。
方式2:宽格式对比汇总
适合直观对比不同基因型在各环境的观测分布,每个环境作为单独一列,无观测的环境填0:
wide_summary <- data %>% count(Gt, Env) %>% # 先统计基因型-环境组合的观测数 pivot_wider( names_from = Env, values_from = n, values_fill = 0 # 没有观测的环境填充0 ) %>% mutate(总观测数 = rowSums(across(where(is.numeric)))) # 追加总观测数列 # 查看前6条结果 head(wide_summary)
说明:这种格式非常适合做后续的可视化(比如热图),能一眼看出基因型的环境偏好。
方式3:明细式多行汇总
适合需要深入分析每个基因型下各环境的观测细节,比如环境内的性状统计、环境占比:
detailed_summary <- data %>% group_by(Gt, Env) %>% summarise( 环境内观测数 = n(), 性状均值 = round(mean(PlantHeight), 2), # 计算该环境下的性状均值(保留2位小数) .groups = "drop_last" # 保留基因型分组,方便计算总览指标 ) %>% mutate( 基因型总观测数 = sum(环境内观测数), 环境观测占比 = round(环境内观测数 / 基因型总观测数, 3) # 计算该环境占基因型总观测的比例 ) %>% ungroup() # 查看前6条结果 head(detailed_summary)
说明:这种多行格式可以直接用于后续的统计建模(比如基因型-环境互作分析),信息维度最丰富。
你可以根据自己的后续需求选择对应的汇总方式,如果还有更具体的统计指标要加,直接在summarise或mutate里追加即可~
内容的提问来源于stack exchange,提问作者akraf
相关产品推荐
相关产品推荐

