如何在创建自己的函数时处理NA

时间:2013-06-23 18:47:25

标签: r dataframe apply na

我想知道在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

提前致谢!

乔治

3 个答案:

答案 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)

您可以使用logarithmsproduct转换为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}}