You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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)

代码说明

  1. 条件顺序:case_when按从上到下的顺序匹配条件,先判断最严格的「整行无NA」,再判断「B-D列有NA」,最后判断「F-H列有NA」,确保规则优先级正确。
  2. 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。

运行结果对应样本数据

ABCDEFGHfilter
123xyzabcxyzabcxyzabcxyz1
123xyzabcxyzabcNAabcxyz3
123NAabcxyzabcxyzabcxyz2
123xyzNAxyzabcxyzabcabc2
345lmnNAxyzabcxyzabcefg2
345lmnrstxyzabcxyzabcNA3
567lmnrstxyzabcxyzabcNA3
567lmnrstNAabcxyzabcrst2
567lmnrstxyzabcxyzNArst3

内容的提问来源于stack exchange,提问作者user2845095

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:20:21