2013-06-23 3 views
3

мне интересно, как иметь дело с 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 

Заранее благодарен!

Георг

+2

Я нахожу ваше использование круглых скобок ... тревожным. –

ответ

7

Вы можете просто использовать аргумент na.rmprod. См ?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 
+0

Это еще лучше, хотя моя стратегия немного более общая, так как она также работает, если функция, которую вы вызываете внутри своей собственной функции, не поддерживает 'na.rm' или что-то подобное. –

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, то (НЕ) оператор ! инвертирует этот логический вектор, т.е. TRUE для действительное значение, FALSE для NA. Использование этого вектора для индексации вернет только допустимые значения.

3

Вы можете использовать logarithms, который будет повернуть product к sums, с которыми вы можете использовать colSums который vectorised и является гораздо быстрее, чем зацикливание с 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 
Смежные вопросы