在 R 中聚合 NA
Aggregate NAs in R
我在计算聚合均值时遇到了处理 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
如果向量全部为 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 显示。
你已经有了类似的想法,但我对函数做了更多的改动,以 return 适合所有情况的值。
你的功能没有问题。 是 的错误是您在 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
参数,您应该对 aggregate
使用 formula
方法。但是,此方法对 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
我在计算聚合均值时遇到了处理 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
如果向量全部为 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 显示。
你已经有了类似的想法,但我对函数做了更多的改动,以 return 适合所有情况的值。
你的功能没有问题。 是 的错误是您在 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
参数,您应该对 aggregate
使用 formula
方法。但是,此方法对 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