2015-05-21 23 views
5

sum function trả về 0 nếu được áp dụng cho bộ trống. Có cách nào đơn giản để làm cho nó trả về NA nếu nó được áp dụng cho một tập hợp các giá trị NA?tổng hợp một bộ/tập hợp rỗng của NA NA thay vì 0?

Dưới đây là một ví dụ borrowed:

test <- data.frame(name = rep(c("A", "B", "C"), each = 4), 
       var1 = rep(c(1:3, NA), 3), 
       var2 = 1:12, 
       var3 = c(rep(NA, 4), 1:8)) 

test 
    name var1 var2 var3 
1  A 1 1 NA 
2  A 2 2 NA 
3  A 3 3 NA 
4  A NA 4 NA 
5  B 1 5 1 
6  B 2 6 2 
7  B 3 7 3 
8  B NA 8 4 
9  C 1 9 5 
10 C 2 10 6 
11 C 3 11 7 
12 C NA 12 8 

Tôi muốn có mỗi tên tổng của ba biến. Đây là những gì tôi đã cố gắng:

var_to_aggr <- c("var1","var2","var3") 
aggr_by <- "name" 
summed <- aggregate(test[var_to_aggr],by=test[aggr_by],FUN="sum", na.rm = TRUE) 

này mang lại cho tôi:

 name var1 var2 var3 
1 A 6 10 0 
2 B 6 26 10 
3 C 6 42 26 

Nhưng tôi cần:

 name var1 var2 var3 
1 A 6 10 NA 
2 B 6 26 10 
3 C 6 42 26 

Tổng tên A, var3 nên NA và không 0. (chỉ cần được rõ ràng, nó không phải là NA cho tên A, var1, nơi tập hợp chứa một NA nhưng cũng có giá trị hợp lệ mà nên được tóm tắt). Bất kỳ ý tưởng?

Tôi đã không quan tâm đến na.action nhưng tổng số dường như không chấp nhận những điều này.

Trả lời

6

Bạn có thể thử

f1 <- function(x) if(all(is.na(x))) NA_integer_ else sum(x, na.rm=TRUE) 
aggregate(.~name, test, FUN=f1, na.action=NULL) 

Hoặc

library(dplyr) 
test %>% 
    group_by(name) %>% 
    summarise_each(funs(f1)) 

Hoặc

library(data.table) 
setDT(test)[, lapply(.SD, f1), name] 
+0

Cảm ơn bạn. Vẫn là người mới bắt đầu và tôi không nghĩ đến việc viết chức năng của riêng tôi để làm điều này. Tôi nghĩ rằng sẽ có một paramter cho tổng hợp có thể giúp tôi. – Kastany

+1

@Kastany Không, đây là trường hợp duy nhất mà chúng tôi phải đề cập cụ thể – akrun

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