R语言按分组过滤NA:保留组内非空keyword及无有效值时的NA
问题原因
你原代码的逻辑会将所有keyword为NA的行直接过滤,导致全组都是NA的id(比如示例中的id=3)被完全删除,无法满足保留一行NA的需求。
正确实现(dplyr方案)
按id分组后,先判断当前组是否全部都是NA值:
- 如果全为NA,仅保留第一行
- 如果存在有效值,保留所有非NA的行
代码如下:
library(dplyr) df <- data.frame( id = c(1L,1L,1L,2L,2L,3L), keyword = c("car","hospital",NA,"cat",NA,NA)) result <- df %>% group_by(id) %>% filter(if (all(is.na(keyword))) { row_number() == 1 } else { !is.na(keyword) }) %>% ungroup()
运行后输出的result和你要求的结果完全一致:
> result # A tibble: 4 × 2 id keyword <int> <chr> 1 1 car 2 1 hospital 3 2 cat 4 3 NA
其他可选方案(基础R)
如果不想依赖dplyr,也可以用基础R的split+lapply实现:
df_list <- split(df, df$id) result <- do.call(rbind, lapply(df_list, function(x) { valid <- x[!is.na(x$keyword), ] if (nrow(valid) > 0) valid else x[1, ] }))
内容的提问来源于stack exchange,提问作者onhalu
相关产品推荐
相关产品推荐

