统计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)
删除 NA
s,然后对剩余值求和。
另一种解决方案仅使用 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
我创建了一个数据框 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(...))
:
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)
删除 NA
s,然后对剩余值求和。
另一种解决方案仅使用 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