我有这个:
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
函数允许每NA
个year
个值。
作为我尝试的第一次尝试:
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
函数以获取预期的数据框?
我用非常复杂的for
和if
循环完全解决了它,但我想知道我是否可以使用矢量化函数来完成它。
有什么想法吗?
答案 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