用 map 替换 for 循环?

标签 r dplyr purrr

我想替换以下 for 循环...

data <- data.frame(x = c(2, 3, 3, 4, 5, 6, 5, 5, 6, 8, 9, 7, 6, 9, 10),
                   y = rep(0, 15))
for (i in 2:length(data$x)) {
  data$y[i] <- ifelse(data$x[i] > data$y[i-1], data$y[i-1] + 2, data$y[i-1] - 1)
}
data$y # 0  2  4  3  5  7  6  5  7  9  8  7  6  8 10

...我想使用 dplyr 并尝试了以下操作:

data %>%
  mutate(y = if_else(x > lag(y), lag(y) + 2, lag(y) -1 ))

但显然我没有成功。任何帮助将不胜感激。

最佳答案

您可以使用 purrr 包中的 accumulate 进行顺序操作:

data %>% 
  mutate( y = accumulate( .x = x[-1],
                          .init = 0,
                          .f = function(y,x) if_else(x > y, y + 2, y - 1) ) 
  )

关于用 map 替换 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60166490/

相关文章:

r - 比较data_frames时如何在testthat中设置expect_equal的容差?

r - 在嵌套的 tibble R 中重命名数据列时,取消引用无法在 mutate 和 map2 中找到变量

r - 将 purrr 列表中的数据帧绑定(bind)在一起

r - 将 R 中的函数作为 .Fortran 参数传递

R x$ed : $ operator is invalid for atomic vectors 中的错误

r - 如何将曲线拟合到直方图

r - 将 count() 应用于数据框中的每个因子变量

r - 如何在 R 中从 XML 中取消嵌套字典?

反转变量中非 NA 值的顺序

r - 参数默认为 "."的 dplyr 函数