R - применить функцию к каждой строке, с данными из строки - PullRequest
1 голос
/ 07 апреля 2011

Есть ли более быстрый способ сделать это:

for (i in 1:nrow(dataframe))
{
dataframe$results <- with(dataframe, myownfunction(column1[i],
  column2[i], column3[i], column4[i], column5[i], column6[i])
}

myownfunction находит подразумеваемую волатильность, используя uniroot(), но когда uniroot не находит решения, он останавливается (обычно из-за некоторых ошибокв данных), и цикл останавливается.Есть ли способ заставить функцию просто вывести NA, если она получает ошибку от uniroot, и продолжить со следующей строкой?

regards.

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

Часть 1: Весьма вероятно, что вы можете добиться успеха с:

ave( dataframe[, c("column1", column2", column3", "column4", "column5", "column6")], myownfunction)

Часть 2: Если вы изменили функцию для проверки на сбой с помощью try и вернули NA, когдане удается, вы можете заполнить недостающие данные в результате правильно.

0 голосов
/ 11 октября 2011

Похоже, у вас есть вопросы:

1) Возврат значения в случае сбоя.Как уже было сказано, посмотрите на failwith в пакете plyr.Это делает именно это.

2) Ускоряет цикл for.Вы пробовали использовать mapply ?Это многомерное приложение, которое применяет функцию к каждому элементу каждого аргумента одновременно.Так что

mapply(myfunc, column1, column2, column3, column4)

(наряду с изменением myfunc для использования failwith) будет делать то, что вы ищете.

plyr-версия mapply - mdply, если вы предпочитаете.

0 голосов
/ 11 октября 2011

Получил это с другого форума, мне нравится больше, чем предыдущие варианты:

R> M <- matrix(1:6, nrow=3, byrow=TRUE)

R> M

         [,1] [,2]
    [1,]    1    2

    [2,]    3    4

    [3,]    5    6
    R> apply(M, 1, function(x) 2*x[1]+x[2])

    [1]  4 10 16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...