使用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()
实现逻辑
- 每个分组内先筛选出所有非真实缺失的字符串,该操作不会影响内容为
"NA"的普通字符串,仅会过滤R原生的缺失值 - 对筛选后的结果做长度判断:
- 若长度为0,说明该分组全为原生缺失值,直接返回
NA_character_(字符型原生缺失值,避免类型转换问题) - 若长度≥1,用
str_c拼接所有有效字符串即可
- 若长度为0,说明该分组全为原生缺失值,直接返回
运行后得到的结果完全符合预期:
# A tibble: 4 × 2 ID string <dbl> <chr> 1 1 " asfdas ; sdf" 2 2 "sadf" 3 3 "NA" 4 4 NA
内容的提问来源于stack exchange,提问作者MsGISRocker
相关产品推荐
相关产品推荐

