R语言:如何基于Col1合并含有效值的重复行,排除空值/NA?
分组合并DataFrame时排除空值与NA
我尝试按Col1分组合并行,但数据框中存在空字段和NA值,希望仅合并Col2中的有效值(非空、非NA),排除空值/NA。当前使用的代码会将空值/NA一并合并:
merge_my_rows <- df %>% group_by(Col1) %>% summarise(Col2 = paste(Col2, collapse = ","))
示例数据框df
| Col1 | Col2 |
|---|---|
| F212 | ALICE |
| D23 | John |
| C64 | NA |
| F212 | BOB |
| C64 | NA |
| D23 | JohnY |
| D19 | Marquis |
期望输出数据框
| Col1 | Col2 |
|---|---|
| F212 | ALICE, BOB |
| D23 | John, JohnY |
| C64 | NA |
| D19 | Marquis |
(注:原期望输出中C64的两行NA应为合并后的单行NA,符合分组聚合逻辑)
修改后的代码
要实现仅合并有效值的需求,可在分组后先筛选出Col2中的非NA、非空值,再进行合并;若分组内无有效值,则保留NA:
library(dplyr) merge_my_rows <- df %>% group_by(Col1) %>% summarise(Col2 = { # 筛选非NA且非空的有效值 valid_values <- Col2[!is.na(Col2) & Col2 != ""] # 根据有效值是否存在返回结果 if (length(valid_values) == 0) { NA_character_ } else { paste(valid_values, collapse = ", ") } }, .groups = "drop")
代码说明
Col2[!is.na(Col2) & Col2 != ""]:同时过滤NA值和空字符串,仅保留有效值- 通过判断处理全NA/空的分组:若没有有效值,返回
NA_character_;否则用paste合并有效值,并用,分隔 .groups = "drop":取消分组状态,返回普通数据框
如果你的数据中空字段仅为NA(无空字符串),可以简化为:
merge_my_rows <- df %>% group_by(Col1) %>% summarise(Col2 = if (all(is.na(Col2))) { NA_character_ } else { paste(na.omit(Col2), collapse = ", ") }, .groups = "drop")
内容的提问来源于stack exchange,提问作者Usman YousafZai
相关产品推荐
相关产品推荐

