有没有办法用来summarise_each()计算数据框中的记录数,但忽略NAs?
示例/样本数据
df_sample <- structure(list(var_1 = c(NA, NA, NA, NA, 1, NA), var_2 = c(NA,
NA, NA, NA, 2, 1), var_3 = c(NA, NA, NA, NA, 3, 2), var_4 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), var_5 = c(NA,
NA, NA, NA, 4, 3)), .Names = c("var_1", "var_2", "var_3", "var_4",
"var_5"), row.names = 5:10, class = "data.frame")
> df_samp
var_1 var_2 var_3 var_4 var_5
5 NA NA NA NA NA
6 NA NA NA NA NA
7 NA NA NA NA NA
8 NA NA NA NA NA
9 1 2 3 NA 4
10 NA 1 2 NA 3
Run Code Online (Sandbox Code Playgroud)
使用summarise_each()并n()计算所有记录:
library(dplyr)
df_samp %>%
summarise_each(funs(n()))
## result:
var_1 var_2 var_3 var_4 var_5
1 6 6 6 6 6
Run Code Online (Sandbox Code Playgroud)
我知道n()不接受参数,因此我可以使用另一种方法summarise_each(),NA在计算记录数时忽略s,如果变量全部则返回0 NA?
期望的结果
var_1 var_2 var_3 var_4 var_5
1 1 2 2 0 2
Run Code Online (Sandbox Code Playgroud)
下面的方法让我在那里的一部分,但我也想返回一个0 var_4:
df_samp %>%
melt %>%
filter(!is.na(value)) %>%
group_by(variable) %>%
summarise(records = n())
## result:
variable records
1 var_1 1
2 var_2 2
3 var_3 2
4 var_5 2
Run Code Online (Sandbox Code Playgroud)
Ste*_*pré 15
尝试:
df_sample %>% summarise_all(funs(sum(!is.na(.))))
Run Code Online (Sandbox Code Playgroud)
这使:
# var_1 var_2 var_3 var_4 var_5
#1 1 2 2 0 2
Run Code Online (Sandbox Code Playgroud)
运用 data.table
library(data.table)
setDT(df_sample)[, lapply(.SD, function(x) sum(!is.na(x)))]
# var_1 var_2 var_3 var_4 var_5
#1: 1 2 2 0 2
Run Code Online (Sandbox Code Playgroud)
或者 base R
vapply(df_sample, function(x) sum(!is.na(x)), numeric(1))
#var_1 var_2 var_3 var_4 var_5
# 1 2 2 0 2
Run Code Online (Sandbox Code Playgroud)