使用summarise_all合并多字符列时出错或含NA的解决方法
按ref分组合并数据框并忽略NA值的解决方法
我明白你现在遇到的问题啦——之前处理数值型数据的代码用到了sum(),但现在你的数据大多是字符型,sum()根本没法用,去掉sum()又会把NA也混进结果里。别担心,咱们调整一下合并的函数逻辑就行。
问题根源
原来的func_paste里用了sum(x, na.rm = T),这个函数是专门用来计算数值求和的,对字符型数据完全不适用,这就是报错的核心原因。而且就算去掉sum(),直接处理的话NA也会被保留下来,不是咱们想要的干净结果。
正确的解决方案
咱们重新定义一个处理函数,核心逻辑是先过滤NA值,再提取唯一值,最后用逗号拼接:
library(dplyr) # 定义处理函数:过滤NA、去重、拼接 func_paste <- function(x) { # 先移除所有NA值,再取唯一值 filtered_vals <- unique(na.omit(x)) # 用逗号把值拼接起来,如果没有非NA值就返回空字符串 paste(filtered_vals, collapse = ",") } # 分组合并 merged_df <- df %>% group_by(ref) %>% summarise_all(func_paste)
如果你的dplyr是1.0.0及以上版本,更推荐使用across()来替代summarise_all()(summarise_all()已经逐步被官方弃用啦):
merged_df <- df %>% group_by(ref) %>% summarise(across(everything(), func_paste))
效果验证
用你的测试数据跑这个代码,结果会是每个ref对应一行:
- 比如
ref="1_S126_L006"的marR列会是"G103S,Y137H",fabG列是"D105E"; ref="150_S96_L005"的Escherichia_coli_GlpT列是"E448K",完全不会出现NA值~
内容的提问来源于stack exchange,提问作者Haakonkas
相关产品推荐
相关产品推荐

