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

使用dplyr分组拼接字符串时保留真实NA并过滤无效NA的方法

实现方案

你可以在分组拼接前先过滤分组内的真实NA值,再根据过滤后是否存在有效值判断返回内容,以下是可直接运行的代码:

library(dplyr)
library(stringr)

ID <- c(1,1,2,2,3,4)
string <- c(' asfdas ', 'sdf', NA,'sadf', 'NA', NA)
df <- data.frame(ID, string)

# 写法1:summarize场景
result <- df %>%
  group_by(ID) %>%
  summarize(
    string = {
      valid_str <- string[!is.na(string)]
      if (length(valid_str) == 0) NA_character_ else str_c(valid_str, collapse = "; ")
    }
  )

# 写法2:更简洁的if_else版本
result <- df %>%
  group_by(ID) %>%
  summarize(
    string = if_else(
      sum(!is.na(string)) == 0,
      NA_character_,
      str_c(string[!is.na(string)], collapse = "; ")
    )
  )

# 若需要用mutate而非summarize,仅需替换对应函数即可
df_conca <- df %>%
  group_by(ID) %>%
  mutate(
    string = if_else(
      sum(!is.na(string)) == 0,
      NA_character_,
      str_c(string[!is.na(string)], collapse = "; ")
    )
  ) %>%
  distinct_all()

实现逻辑

  1. 每个分组内先筛选出所有非真实缺失的字符串,该操作不会影响内容为"NA"的普通字符串,仅会过滤R原生的缺失值
  2. 对筛选后的结果做长度判断:
    • 若长度为0,说明该分组全为原生缺失值,直接返回NA_character_(字符型原生缺失值,避免类型转换问题)
    • 若长度≥1,用str_c拼接所有有效字符串即可

运行后得到的结果完全符合预期:

# A tibble: 4 × 2
     ID string        
  <dbl> <chr>         
1     1 " asfdas ; sdf"
2     2 "sadf"        
3     3 "NA"          
4     4 NA   

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:09:01