使用dplyr添加允许最大NA值的值

时间:2017-08-15 04:07:52

标签: r dplyr

我有这个:

DF = data.frame(month=rep(1:3,3), 
                year=rep(1998:2000,each=3), 
                A=c(NA,3,2,rep(NA,2),4,4,5,NA), 
                B=c(NA,4,5,rep(NA,4),5,6), 
                C=c(10,rep(NA,3),2:4,rep(NA,2)))
> head(DF)
  month  year  A  B  C
1     1  1998 NA NA 10
2     2  1998  3  4 NA
3     3  1998  2  5 NA
4     1  1999 NA NA NA
5     2  1999 NA NA  2
6     3  1999  4 NA  3

我希望得到这个:

   year    A   B   C
1  1998    5   9  NA
2  1999   NA  NA   5
3  2000    9  11  NA

以上意味着sum函数允许每NAyear个值。

作为我尝试的第一次尝试:

library(dplyr)    
DF %>% group_by(year) %>% summarise_all(function(x) sum(x, na.rm=T))

但显然我在写na.rm=T时得到了以下输出:

   year    A   B   C
1  1998    5   9  10
2  1999    4   0   5
3  2000    9  11   4

我的问题是:如何将最大数量的NA值传递给sum函数以获取预期的数据框?

我用非常复杂的forif循环完全解决了它,但我想知道我是否可以使用矢量化函数来完成它。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

library(dplyr)

DF <- data.frame(month=rep(1:3,3), 
           year=rep(1998:2000,each=3), 
           A=c(NA,3,2,rep(NA,2),4,4,5,NA), 
           B=c(NA,4,5,rep(NA,4),5,6), 
           C=c(10,rep(NA,3),2:4,rep(NA,2)))

DF <- DF %>% group_by(year) %>%
  summarise_all(function(x) ifelse(2 * sum(is.na(x)) > length(x), NA, sum(x, na.rm=T)))

DF$month <- NULL
as.data.frame(DF)
#   year  A  B  C
# 1 1998  5  9 NA
# 2 1999 NA NA  5
# 3 2000  9 11 NA

答案 1 :(得分:1)

dplyr不能轻松分配子集,但有可能,因此您可以将0分配给每个组中的第一个NA值,然后使用{{1} }没有sum

na.rm = TRUE