我想知道在R中创建自己的函数时如何处理NA值。
我的代码如下:
# The function is simple:
function.BHR <-function(x) prod(1+x)-1
# The structure of the data.frame:
dat <- t(data.frame(
"A"=c(20:29/100),
"B"=c(35:44/100),
"C"=c(20:29/100),
"E"=c(50:57/100,NA,NA),
"E"=c(45:51/100,NA,NA,NA))
apply(dat,2,function.BHR)
简单的apply函数为最后三列提供NA。而不是这个 它应该应用所有非NA值的函数。因此:
for column 8:
function.BHR(c(0.27,0.42,0.27,0.57))
[1] 2.595799
for column 9:
function.BHR(c(0.28,0.43,0.28))
[1] 1.342912
for column 10:
function.BHR(c(0.29,0.44,0.29))
[1] 1.396304
提前致谢!
乔治
答案 0 :(得分:7)
您只需使用na.rm
的{{1}}参数即可。有关详细信息,请参阅prod
:
?prod
答案 1 :(得分:5)
更改您的功能以删除NA
:
function.BHR <-function(x) {
x = x[!is.na(x)]
(prod((1+x))-1)
}
> apply(dat,2,function.BHR)
[1] 3.228200 3.389747 3.556183 3.727619 3.904166 4.085938 4.273048 2.595799
[9] 1.342912 1.396304
is.na
返回一个逻辑向量,告诉哪些值为NA
,!
(NOT)运算符会反转此逻辑向量,即TRUE
表示有效值FALSE
1}} NA
。使用此向量进行索引只会返回有效值。
答案 2 :(得分:3)
您可以使用logarithms
将product
转换为sums
,您可以使用colSums
apply
进行矢量化并且更快而不是使用exp(colSums(log(dat+1), na.rm=TRUE))-1
# [1] 3.228200 3.389747 3.556183 3.727619 3.904166 4.085938 4.273048 2.595799 1.342912 1.396304
循环:
{{1}}