Используйте функцию для циклического перебора строк, предыдущая строка является входом для следующей строки - PullRequest
0 голосов
/ 08 октября 2018

У меня есть следующий набор данных:

df <- data.frame(a=1:10,b=10:1)

У меня есть следующая функция:

fun <- function(x,y) x*y/1000+x+y

Я хочу следующий вывод:

 for (i in 2:10){df$a[i] = fun(df$a[i],df$a[i-1])};for (i in 2:10){df$b[i] = fun(df$b[i],df$b[i-1])}}

df
#            a        b
# 1   1.000000 10.00000
# 2   3.002000 19.09000
# 3   6.011006 27.24272
# 4  10.035050 34.43342
# 5  15.085225 40.64002
# 6  21.175737 45.84322
# 7  28.323967 50.02659
# 8  36.550559 53.17667
# 9  45.879514 55.28303
# 10 56.338309 56.33831

По существу,Элемент для строки i является функцией, выводимой из последней строки и текущей строки, и это выполняется рекурсивно.Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

A base R опция с Reduce с accumulate = TRUE

df[] <- lapply(df, function(x) Reduce(fun, x, accumulate = TRUE))
df
#           a        b
#1   1.000000 10.00000
#2   3.002000 19.09000
#3   6.011006 27.24272
#4  10.035050 34.43342
#5  15.085225 40.64002
#6  21.175737 45.84322
#7  28.323967 50.02659
#8  36.550559 53.17667
#9  45.879514 55.28303
#10 56.338309 56.33831
0 голосов
/ 08 октября 2018

Мы можем использовать функцию accumulate из пакета purrr.

library(purrr)

df <- data.frame(a=1:10,b=10:1)

fun <- function(x,y) x*y/1000+x+y

df$a <- accumulate(df$a, fun)
df$b <- accumulate(df$b, fun)

df
#            a        b
# 1   1.000000 10.00000
# 2   3.002000 19.09000
# 3   6.011006 27.24272
# 4  10.035050 34.43342
# 5  15.085225 40.64002
# 6  21.175737 45.84322
# 7  28.323967 50.02659
# 8  36.550559 53.17667
# 9  45.879514 55.28303
# 10 56.338309 56.33831
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...