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
相关产品推荐
相关产品推荐

