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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:00:46