繁体   English   中英

R中的聚合NA

[英]Aggregate NAs in R

我在计算聚合方法时遇到麻烦。 请参阅以下代码:

tab=data.frame(a=c(1:3,1:3), b=c(1,2,NA,3,NA,NA))
tab
  a  b
1 1  1
2 2  2
3 3 NA
4 1  3
5 2 NA
6 3 NA

attach(tab)
aggregate(b, by=list(a), data=tab, FUN=mean, na.rm=TRUE)
  Group.1   x
1       1   2
2       2   2
3       3 NaN

如果向量具有所有NA,我想要NA而不是NaN,即我想要输出

  Group.1   x
1       1   2
2       2   2
3       3  NA

我尝试使用自定义函数:

adjmean=function(x) {if(all(is.na(x))) NA else mean(x,na.rm=TRUE)}

但是,我收到以下错误:

aggregate(b, by=list(a), data=tab, FUN=adjmean)

Error in FUN(X[[1L]], ...) : 
  unused argument (data = list(a = c(1, 2, 3, 1, 2, 3), b = c(1, 2, NA, 3, NA, NA)))

简而言之,如果列具有所有NA,我希望NA作为输出而不是NaN。 如果它具有很少的NA,那么它应该计算忽略NA的均值。

任何帮助,将不胜感激。

谢谢

这与您所拥有的非常接近,但用自定义函数替换mean(x, na.rm=TRUE) ,该函数可以计算非NA值的平均值,或者提供NA本身:

R> with(tab, 
        aggregate(b, by=list(a), FUN=function(x) 
             if (any(is.finite(z<-na.omit(x)))) mean(z) else NA))
  Group.1  x
1       1  2
2       2  2
3       3 NA
R> 

这真的是一行,但我把它分解成适合SO显示器。

而你已经有了类似的想法,但我更改了函数以在所有情况下返回合适的值。

你的功能没有任何问题。 什么错的是您正在使用的默认方法的参数aggregate不存在:

adjmean = function(x) {if(all(is.na(x))) NA else mean(x,na.rm=TRUE)}
attach(tab)  ## Just because you did it. I don't recommend this.

## Your error
aggregate(b, by=list(a), data=tab, FUN=adjmean)
# Error in FUN(X[[i]], ...) : 
#   unused argument (data = list(a = c(1, 2, 3, 1, 2, 3), b = c(1, 2, NA, 3, NA, NA)))

## Dropping the "data" argument
aggregate(b, list(a), FUN = adjmean)
#   Group.1  x
# 1       1  2
# 2       2  2
# 3       3 NA

如果要使用data参数,则应使用formula方法进行aggregate 但是,此方法对NA处理方式不同,因此您需要一个额外的参数na.action

例:

detach(tab) ## I don't like having things attached
aggregate(b ~ a, data = tab, adjmean)
#   a b
# 1 1 2
# 2 2 2
aggregate(b ~ a, data = tab, adjmean, na.action = na.pass)
#   a  b
# 1 1  2
# 2 2  2
# 3 3 NA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM