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

R语言dplyr使用mutate按列名区间统计行NA值的实现方法

解决方案

你想要的按列名区间选择的需求可以直接通过dplyr内置的tidyselect选择语法实现,基础R的字符串不支持:区间运算,但tidyverse的列选择上下文可以直接识别未加引号的列名区间。

方案1:使用pick()函数(dplyr 1.0.0及以上版本推荐)

pick()可以在mutate()/summarise()等函数内部按选择规则返回指定列的子数据框,和你之前用[,]取子集的逻辑完全一致,写法如下:

master_clean <- master_clean %>%
  mutate(
    nbNA_pt1 = rowSums(is.na(pick(Q1:Q12))),
    nbNA_pt2 = rowSums(is.na(pick(Q13:Q20))),
    nbNA_pt3 = rowSums(is.na(pick(Q21:Q90)))
  )

如果需要用字符串变量指定起止列名,可以搭配all_of()使用:

start_col <- "Q1"
end_col <- "Q12"
master_clean <- master_clean %>%
  mutate(nbNA_pt1 = rowSums(is.na(pick(all_of(start_col):all_of(end_col)))))

方案2:按列名规则匹配(不受列顺序影响)

如果你要选择的列名是固定前缀加数字的格式,不需要按列的排列顺序选区间,可以用num_range()选择器,不管列怎么排序都会准确匹配对应名字的列:

master_clean <- master_clean %>%
  mutate(
    nbNA_pt1 = rowSums(is.na(pick(num_range("Q", 1:12)))),
    nbNA_pt2 = rowSums(is.na(pick(num_range("Q", 13:20)))),
    nbNA_pt3 = rowSums(is.na(pick(num_range("Q", 21:90))))
  )

旧版本dplyr兼容写法

如果你的dplyr版本低于1.0.0没有pick()函数,可以用across()替代:

master_clean <- master_clean %>%
  mutate(
    nbNA_pt1 = rowSums(is.na(across(Q1:Q12))),
    nbNA_pt2 = rowSums(is.na(across(Q13:Q20))),
    nbNA_pt3 = rowSums(is.na(across(Q21:Q90)))
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:18:04