统计dplyr中每一行的非NA数值个数

Count the number of non-NA numeric values of each row in dplyr

我创建了一个数据框 df。

df <- data.frame (id = 1:10, 
    var1 = 10:19,
    var2 = sample(c(1:2,NA), 10, replace=T),
    var3 = sample(c(3:5, NA), 10, replace=T))

我需要的是一个新列 var4,它计算每行(不包括 id 列)的非 NA 值的数量。因此,例如,如果一行类似于 var1=19、var2=1、var3=NA,则 var4=2。我找不到在 dplyr 中执行此操作的好方法。 类似于:

df %in% mutate(var4= ... )

如果有人能帮助我,我将不胜感激。

使用select + is.na + rowSums, select(., -id) returns原始数据框(.)与id 排除,然后使用 rowSums(!is.na(...)):

计算非 NA 值的数量
df %>% mutate(var4 = rowSums(!is.na(select(., -id))))

#   id var1 var2 var3 var4
#1   1   10   NA    4    2
#2   2   11    1   NA    2
#3   3   12    2    5    3
#4   4   13    2   NA    2
#5   5   14    1   NA    2
#6   6   15    1   NA    2
#7   7   16    1    5    3
#8   8   17   NA    4    2
#9   9   18   NA    4    2
#10 10   19   NA   NA    1

我知道 OP 要求 dplyr 解决方案,但基础 R 在这里很简单:

df$var4 <- rowSums(!is.na(df[,2:4]))

rowSums 计算第 2 - 4 列中不为 NA (!is.na) 的值的数量。

注意,这是对 is.na 生成的逻辑向量求和,不同于:

rowSums(df[,2:4], na.rm = TRUE)

删除 NAs,然后对剩余值求和。

另一种解决方案仅使用 base-r

data.frame(df, var4 = apply(df[,-1], 1, function(x) sum(!is.na(x))))
   id var1 var2 var3 var4
1   1   10    1    5    3
2   2   11    2    5    3
3   3   12    2    5    3
4   4   13   NA    3    2
5   5   14   NA    5    2
6   6   15    1    5    3
7   7   16   NA    3    2
8   8   17   NA    4    2
9   9   18   NA    3    2
10 10   19    1    4    3