Применение функции к нескольким строкам с использованием значений из нескольких рядов

Я создал следующую простую функцию в R:

fun    <- function(a,b,c,d,e){b+(c-a)*((e-b)/(d-a))}

Что я хочу применить эту функцию к data.frame это выглядит примерно так:

> data.frame("x1"=seq(55,75,5),"x2"=round(rnorm(5,50,10),0),"x3"=seq(30,10,-5))
  x1 x2 x3
1 55 51 30
2 60 45 25
3 65 43 20
4 70 57 15
5 75 58 10

Я хочу подать заявку fun каждой отдельной строке, чтобы создать новую переменную x4, но теперь наступает трудная часть (по крайней мере для меня..): для аргументов d и e я хочу использовать значения x2 а также x3 из следующего ряда. Так что для первого ряда примера это будет означать: fun(a=55,b=51,c=30,d=45,e=25), Я знаю, что я могу использовать mapply() чтобы применить функцию к каждой строке, но я понятия не имею, как сказать mapply, что она должна использовать некоторые значения из следующей строки, или я должен искать другой подход, чем mapply()?

Спасибо заранее!

1 ответ

Решение

Использование mapply, но сдвиньте четвертый и пятый столбцы на один ряд. Вы можете сделать это вручную или использовать taRifx::shift,

> dat
  x1 x2 x3
1 55 25 30
2 60 58 25
3 65 59 20
4 70 68 15
5 75 43 10
library(taRifx)
> shift(dat$x2)
[1] 58 59 68 43 25
> mapply( dat$x1, dat$x2, dat$x3, shift(dat$x2), shift(dat$x3) , FUN=fun )
[1]    25.00000 -1272.00000   719.00000   -50.14815    26.10000

Если вы хотите, чтобы последняя строка была NA, а не переносом, используйте wrap=FALSE,pad=TRUE:

> shift(dat$x2,wrap=FALSE,pad=TRUE)
[1] 58 59 68 43 NA
Другие вопросы по тегам