在R语言中使用pick与rowSums统计a类变量非缺失值的问题
问题分析与修正
原代码存在几个关键问题:
- 函数
anymatch逻辑错误:is.na(vars)是对变量名向量判断是否缺失,而非判断数据列中的值是否非缺失;且统计的是缺失值数量,和需求的「已填写实例数」完全相反。 - 函数调用参数不匹配:定义的目标变量是
avars,但调用时传了未定义的vars。
修正后的代码方案
方案1:修正原函数逻辑
library(dplyr) anymatch <- function(vars){ # 先选中指定列,再判断每个值是否非缺失,最后按行求和 rowSums(!is.na(pick(all_of(vars))), na.rm = TRUE) } data <- tibble( a1 = c("Yes", NA, "No", "Dont know"), a2 = c("No", NA, "No", NA), a3 = c("Good", "Bad", "Good", NA), b1 = c(20, 34, 23, 45) ) avars <- data |> select(starts_with("a")) |> names() data |> mutate(acount = anymatch(avars))
方案2:更简洁的链式写法(无需自定义函数)
library(dplyr) data <- tibble( a1 = c("Yes", NA, "No", "Dont know"), a2 = c("No", NA, "No", NA), a3 = c("Good", "Bad", "Good", NA), b1 = c(20, 34, 23, 45) ) data |> mutate(acount = rowSums(!is.na(pick(starts_with("a"))), na.rm = TRUE))
结果说明
运行修正后的代码,会得到每行中a开头列的非缺失值计数:
- 第1行:3个非缺失值
- 第2行:1个非缺失值(仅a3有值)
- 第3行:3个非缺失值
- 第4行:1个非缺失值(仅a1有值)
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

