2015-06-27 8 views
6

Czy istnieje sposób użycia summarise_each() do policzenia liczby rekordów w ramce danych, ale zignorowania NA s?r - używanie funkcji podsumowania_each() do zliczania rekordów ignorujących NA

example/Dane Przykładowe

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 

Korzystanie summarise_each() i n() liczy wszystkie rekordy:

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 

wiem, że n() nie przyjmuje argumentów, zatem istnieje inny sposób mogę użyj w ciągu summarise_each(), które zignoruje NA s przy zliczaniu liczby rekordów i zwróci zero, jeśli zmienna jest równa l NA?

pożądanego rezultatu

var_1 var_2 var_3 var_4 var_5 
1  1  2  2  0  2 

Poniższa metoda pobiera mnie część drogi tam, ale chciałbym również zwrócić 0 dla 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

Non-'dplyr' sposób może być 'colSums (! Is.na (df_sample))'. – Henrik

Odpowiedz

14

Spróbuj:

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

Co daje:

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

To fajna sztuczka; jaka jest suma faktycznie podsumowująca? – tospig

+1

Liczba "TRUE". '! is.na (.)' zwróci 'TRUE' dla każdej wartości innej niż "NA". Spróbuj 'df_przykład%>% mutate_each (funs (! Is.na (.)))' –

+0

@ Steven Beaupré Jaka jest odpowiedź, jeśli użyjemy 'podsumowania_atego 'zamiast' podsumowania_each'? – johnsonzhj

4

Korzystanie 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 

lub przy 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 
Powiązane problemy