【问题标题】:How to deal with NA's while creating my own function如何在创建自己的函数时处理 NA
【发布时间】:2013-06-23 18:47:24
【问题描述】:

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

简单的应用函数为最后三列提供 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

提前致谢!

乔治

【问题讨论】:

  • 我发现你使用括号......令人不安。

标签: r dataframe apply na


【解决方案1】:

您可以简单地使用prodna.rm 参数。详情见?prod

function.BHR <-function(x) { prod(1+x, na.rm=TRUE)-1 }

apply(dat, 2, function.BHR)

# [1] 3.228200 3.389747 3.556183 3.727619 3.904166 4.085938 4.273048 2.595799 1.342912 1.396304

【讨论】:

  • 那就更好了,虽然我的策略更通用一些,因为如果你在自己的函数中调用的函数不支持na.rm 或类似的东西,它也可以工作。
【解决方案2】:

更改您的功能以删除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 为有效值,FALSENA。使用此向量进行索引只会返回有效值。

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2019-11-29
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2020-04-06
      • 1970-01-01
      • 2015-06-10
      相关资源
      最近更新 更多