在R中处理行级NA:用mutate和case_when生成filter列的需求
用mutate和case_when实现新增filter列
完整代码示例
首先确保安装并加载dplyr包:
# 安装包(首次使用时运行) install.packages("dplyr") # 加载包 library(dplyr) # 构造样本数据集 df <- tibble( A = c(123, 123, 123, 123, 345, 345, 567, 567, 567), B = c("xyz", "xyz", NA, "xyz", "lmn", "lmn", "lmn", "lmn", "lmn"), C = c("abc", "abc", "abc", NA, NA, "rst", "rst", "rst", "rst"), D = c("xyz", "xyz", "xyz", "xyz", "xyz", "xyz", "xyz", NA, "xyz"), E = rep("abc", 9), F = c("xyz", NA, "xyz", "xyz", "xyz", "xyz", "xyz", "xyz", "xyz"), G = c("abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", NA), H = c("xyz", "xyz", "xyz", "abc", "efg", NA, NA, "rst", "rst") ) # 新增filter列 df <- df %>% mutate( filter = case_when( # 规则1:整行无NA值 if_all(everything(), ~!is.na(.)) ~ 1, # 规则2:B至D列存在NA值 if_any(B:D, is.na) ~ 2, # 规则3:F至H列存在NA值 if_any(F:H, is.na) ~ 3 ) ) # 查看结果 print(df)
代码说明
- 条件顺序:
case_when按从上到下的顺序匹配条件,先判断最严格的「整行无NA」,再判断「B-D列有NA」,最后判断「F-H列有NA」,确保规则优先级正确。 if_all和if_any函数:if_all(everything(), ~!is.na(.)):检查所有列是否都没有NA值,满足则返回TRUE。if_any(B:D, is.na):检查B到D列中是否存在至少一个NA值,满足则返回TRUE。if_any(F:H, is.na):检查F到H列中是否存在至少一个NA值,满足则返回TRUE。
运行结果对应样本数据
| A | B | C | D | E | F | G | H | filter |
|---|---|---|---|---|---|---|---|---|
| 123 | xyz | abc | xyz | abc | xyz | abc | xyz | 1 |
| 123 | xyz | abc | xyz | abc | NA | abc | xyz | 3 |
| 123 | NA | abc | xyz | abc | xyz | abc | xyz | 2 |
| 123 | xyz | NA | xyz | abc | xyz | abc | abc | 2 |
| 345 | lmn | NA | xyz | abc | xyz | abc | efg | 2 |
| 345 | lmn | rst | xyz | abc | xyz | abc | NA | 3 |
| 567 | lmn | rst | xyz | abc | xyz | abc | NA | 3 |
| 567 | lmn | rst | NA | abc | xyz | abc | rst | 2 |
| 567 | lmn | rst | xyz | abc | xyz | NA | rst | 3 |
内容的提问来源于stack exchange,提问作者user2845095
相关产品推荐
相关产品推荐

