3

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)

単純な適用関数は、最後の 3 つの列に対して 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

前もって感謝します!

ゲオルク

4

3 に答える 3

7

na.rmの引数をそのまま使用できますprod。詳細?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
于 2013-06-23T18:55:14.527 に答える
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.naNAは、値がであることを示す論理ベクトルを返します。 !(NOT) 演算子は、この論理ベクトルを反転しTRUEます。このベクトルをインデックス付けに使用すると、有効な値のみが返されます。FALSENA

于 2013-06-23T18:53:26.967 に答える