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的均值.
任何帮助,将不胜感激.
谢谢
这与您所拥有的非常接近,但替换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显示器.
而你已经有了类似的想法,但我更改了函数以在所有情况下返回合适的值.