2015-06-27 25 views
6

Có cách nào để sử dụng summarise_each() để đếm số lượng bản ghi trong một khung dữ liệu, nhưng bỏ qua NA s?r - sử dụng summaryise_each() để đếm các bản ghi bỏ qua NA

Ví dụ/mẫu dữ liệu

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 

Sử dụng summarise_each()n() đếm tất cả các hồ sơ:

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 

Tôi biết rằng n() không chấp nhận lập luận, do đó là có một phương pháp khác tôi có thể sử dụng trong phạm vi summarise_each() sẽ bỏ qua số NA khi đếm số lượng bản ghi và sẽ trả về 0 nếu biến là al l NA?

mong muốn Kết quả

var_1 var_2 var_3 var_4 var_5 
1  1  2  2  0  2 

Các phương pháp sau đây được tôi một phần của con đường đó, nhưng tôi cũng muốn trả lại một 0 cho 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 
+4

Một cách phi 'dplyr' thể được 'colSums (! Is.na (df_sample))'. – Henrik

Trả lời

14

Hãy thử:

df_sample %>% summarise_each(funs(sum(!is.na(.)))) 

Cho phép:

# var_1 var_2 var_3 var_4 var_5 
#1  1  2  2  0  2 
+0

Đó là một mẹo nhỏ gọn; 'tổng hợp' thực sự là gì? – tospig

+1

Số lượng 'TRUE'. '! is.na (.)' sẽ trả về 'TRUE' cho mỗi giá trị không phải' '' '. Hãy thử 'df_sample%>% mutate_each (funs (! Is.na (.)))' –

+0

@ Steven Beaupré Câu trả lời là gì nếu chúng ta 'summaryise_at' thay vì' summaryise_each'? – johnsonzhj

4

Sử dụng 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 

Hoặc với 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 
Các vấn đề liên quan