dplyr:迭代计算

时间:2016-08-16 20:04:55

标签: r vector iteration dplyr

我正在试图弄清楚dplyr是否有办法逐行计算变量,这样它就可以引用之前记录的一个记录的结果。

这是使用for-loops实现我想要的代码:

x <- data.frame(x1 = c(1:10)) 

#This works.
x$x2[1] <- 0

for (i in 2:nrow(x)) {
  x$x2[i] <- x$x2[i-1]*1.1 + 1
}

我天真的贪婪尝试,这不起作用:

#This doesn't work. "Error: object'x1' not found"
x %>% mutate(x2 = ifelse(x1 == 1, 0, lag(x2)*1.1 + 1))

找到一个dplyr解决方案会很高兴,因为此步骤是严重依赖它的工作流程的一部分。

谢谢。

修改

以上是我正在尝试做的简化示例。封闭形式的解决方案不起作用,因为应用的功能比此处显示的更复杂和动态。例如,假设'add_var'和'pwr_var'是随机整数,我想计算一下:

x$x2[1] <- 0

for (i in 2:nrow(x)) {
  x$x2[i] <- ( x$x2[i-1]*1.1 + x$add_var[i] ) ^ x$pwr_var[i]
}

3 个答案:

答案 0 :(得分:3)

通常,如果要计算依赖于先前值的值,最好使用Reduce。这是您的数据示例

x %>% mutate(x3 = Reduce(function(a,b) a*1.1+1, 1:(n()-1), 0, acc=T))

但是在您的示例中,对于不依赖于迭代的术语,存在closed form。你可以做到

x %>% mutate(x4=(1.1^(row_number()-1)-1)/(1.1-1)*1)

答案 1 :(得分:0)

如果您真的想使用扩展表示法,那么您可以使用库magrittr,定义执行转换的函数,然后应用管道运算符。另外,使用data_frame对象,而不是dplyr的data.frame对象。

    library(dplyr)
    library(magrittr)
    x <- data_frame(x1 = c(1:10))
    f_x <- function(x){(x-1)*1.1+1}
    x$x2 <-x %$% x1 %>% f_x

答案 2 :(得分:-2)

您的代码适合我。结果如下:

   x1        x2
1   1  0.000000
2   2  1.000000
3   3  2.100000
4   4  3.310000
5   5  4.641000
6   6  6.105100
7   7  7.715610
8   8  9.487171
9   9 11.435888
10 10 13.579477

你可以尝试使用dplyr代码行:

 x %>% mutate(x2 = ifelse(x1 == 1, 0, lag(x2)*1.1 + 1))