在tidyverse管道中使用case_when和mutate时提示找不到列如何解决?
报错原因
- 你的
bac_totalOTU属于已分组的tibble,结构输出中明确标注分组字段为OTU_ID, Phylum, Family, Genus,在分组状态下执行mutate操作时,对外部数据框bac_OTUsums使用位置索引[1,2]/[2,2]的调用方式会受到分组计算环境的限制,导致索引识别失败,触发报错。 - 另外使用位置索引取值本身稳定性差,若后续
bac_OTUsums的行顺序发生变化,会直接导致计算结果错误,不推荐该写法。
解决方法
方案1:先解组再按条件匹配取值
先通过ungroup()解除数据分组状态,同时修改总和取值逻辑,按Treatment字段匹配取值,避免位置索引的不稳定问题:
bac_totalOTU %>% ungroup() %>% # 解除原数据的分组状态,是解决本次报错的核心操作 select(OTU_ID, Phylum, Family, Genus, Treatment, TOTAL_OTU) %>% mutate( OTUpercent = case_when( Treatment == "DOC Removed" ~ TOTAL_OTU / bac_OTUsums$totalByTreatment[bac_OTUsums$Treatment == "DOC Removed"], TRUE ~ TOTAL_OTU / bac_OTUsums$totalByTreatment[bac_OTUsums$Treatment == "None"] ) )
方案2:左连接总和表一步计算
更简洁且不易出错的写法是直接通过左关联提前计算好的总和表,无需手动写条件判断:
bac_totalOTU %>% ungroup() %>% left_join(bac_OTUsums, by = "Treatment") %>% mutate(OTUpercent = TOTAL_OTU / totalByTreatment) %>% select(-totalByTreatment) # 不需要保留总和列的话可执行该行删除
内容的提问来源于stack exchange,提问作者int12345
相关产品推荐
相关产品推荐

