R中的聚合NA

Abh*_*tta 3 aggregate r nan na

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

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
Run Code Online (Sandbox Code Playgroud)

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

  Group.1   x
1       1   2
2       2   2
3       3  NA
Run Code Online (Sandbox Code Playgroud)

我尝试使用自定义函数:

adjmean=function(x) {if(all(is.na(x))) NA else mean(x,na.rm=TRUE)}
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

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)))
Run Code Online (Sandbox Code Playgroud)

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

任何帮助,将不胜感激.

谢谢

Dir*_*tel 5

这与您所拥有的非常接近,但替换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> 
Run Code Online (Sandbox Code Playgroud)

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

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

  • @DirkEddelbuettel,对不起,但[他们的功能没有完全错误](http://stackoverflow.com/a/29873855/1270695).... (2认同)