我正在试图弄清楚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]
}
答案 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))