使用tidyverse按name1、name2同时相同条件合并R数据框多行
实现代码
library(tidyverse) # 构建示例数据 df <- data.frame(value = c(2,2,2,2,1,1,1,1,1,1), name1 = c("a", "a", "b", "b", 'c', "d", "e", NA, NA, NA), name2 = c("x", "x", "x", "x", "x", "x", "y", NA, NA, NA)) # 按规则合并行 res <- bind_rows( # 非空组合去重 df %>% filter(!is.na(name1) | !is.na(name2)) %>% distinct(name1, name2, .keep_all = TRUE), # 保留全部全空行 df %>% filter(is.na(name1) & is.na(name2)) )
逻辑说明
dplyr的distinct函数默认会将NA判定为相等值,如果直接对全量数据按name1、name2去重,所有name1和name2均为NA的行只会保留1条,不符合预期。因此拆分两类行分别处理:
- 对
name1或name2不为NA的行,按两个字段的组合去重,.keep_all = TRUE参数用来保留value列的取值 - 直接保留所有
name1和name2同时为NA的行 - 最后拼接两类行即可得到你需要的输出结果
执行代码后输出的res和你提供的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

