2015-06-25 45 views
6

Tôi có một md khung dữ liệu:dplyr: xử lý bằng NA trong khi tính trung bình (summarize_each) trên đối tượng group_by

md <- data.frame(x = c(3,5,4,5,3,5), y = c(5,5,5,4,4,1), z = c(1,3,4,3,5,5), 
     device1 = c("c","a","a","b","c","c"), device2 = c("B","A","A","A","B","B")) 
md[2,3] <- NA 
md[4,1] <- NA 
md 

tôi muốn để tính toán phương tiện DEVICE1/kết hợp DEVICE2 sử dụng dplyr:

library(dplyr) 
md %>% group_by(device1, device2) %>% summarise_each(funs(mean)) 

Tuy nhiên, tôi đang nhận được một số NA. Tôi muốn các NA bị bỏ qua (na.rm = TRUE) - tôi đã thử, nhưng chức năng không muốn chấp nhận lập luận này. Cả những dòng này gây ra lỗi:

md %>% group_by(device1, device2) %>% summarise_each(funs(mean), na.rm = TRUE) 
md %>% group_by(device1, device2) %>% summarise_each(funs(mean, na.rm = TRUE)) 
+2

Bạn có thể cần 'funs (mean = mean (., Na.rm = TRUE)) ' – akrun

Trả lời

6

đơn giản như:

funs(mean(., na.rm = TRUE)) 
9

thử:

library(dplyr) 
md %>% group_by(device1, device2) %>% 
     summarise_each(funs(mean(., na.rm = TRUE))) 
9

Những câu trả lời khác cho thấy bạn cú pháp để thông qua mean(., na.rm = TRUE) vào summarize/_each.

Cá nhân, tôi đối phó với điều này vì vậy thường xuyên, và nó thật khó chịu mà tôi chỉ xác định các thiết lập sau đây của các chức năng cơ bản NA-aware (ví dụ trong .Rprofile của tôi), chẳng hạn mà bạn có thể áp dụng chúng với dplyr với summarize(mean_) và không có pesky arg-passing; cũng giữ mã nguồn sạch hơn và dễ đọc hơn, đó là một cộng mạnh mẽ:

mean_ <- function(...) mean(..., na.rm=T) 
median_ <- function(...) median(..., na.rm=T) 
sum_ <- function(...) sum(..., na.rm=T) 
sd_  <- function(v) sqrt(sum((v-mean(v))^2)/length(v)) 
cor_ <- function(...) cor(..., use='pairwise.complete.obs') 
table_ <- function(...) table(..., useNA='ifany') 
mode_ <- function(...) { 
    tab <- table(...) 
    names(tab[tab==max(tab)]) # the '==' implicitly excludes NA values 
} 
clamp_ <- function(..., minval=0, maxval=70) pmax(minval, pmin(maxval,...)) 

Thực sự bạn muốn để có thể flick một công tắc toàn cầu một lần và cho tất cả, giống như na.action/na.pass/na.omit/na.fail nói với các chức năng như hành vi mặc định những gì để làm, và không ném lỗi hoặc không nhất quán, như họ hiện đang làm, trên các gói khác nhau.

Đã từng là gói CRAN được gọi là Defaults để đặt mặc định cho mỗi chức năng nhưng không được duy trì kể từ năm 2014, trước 3.x. Để biết thêm chi tiết về nó Setting Function Defaults R on a Project Specific Basis

+1

Tôi thực sự phản đối downvoters, đây là một giải pháp khiến tôi mất nhiều năm ; nó nhỏ gọn, dễ đọc, thanh lịch và bạn vẫn có thể ghi đè mặc định bằng '...' passthrough args. Nếu sự phản đối duy nhất là quy ước đặt tên, thì hãy đề xuất một quy ước tốt hơn. – smci

Các vấn đề liên quan