用map替换for循环?

用map替换for循环?,r,dplyr,purrr,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 #

我想替换以下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

但显然我没有成功。非常感谢您的帮助。

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

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

如果您还对使用@Sotos在评论中建议的
Reduce
的基本解决方案感兴趣:

data$y <- Reduce(function(y,x) ifelse(x > y, y+2, y-1)
                 , data$x[-1], data$y[1], accumulate = TRUE)
data$y
# [1]  0  2  4  3  5  7  6  5  7  9  8  7  6  8 10
数据$y,y+2,y-1)
,数据$x[-1],数据$y[1],累计=真)
数据$y
# [1]  0  2  4  3  5  7  6  5  7  9  8  7  6  8 10

数据$y y)y+2其他y-1
,数据$x[-1],数据$y[1],累计=真)

我可能错了,但我认为
ifelse
if\u else
case\u当
时没有帮助。for循环将逐步遍历数据,并在前一个y的基础上计算每个y。我的猜测是使用
map
。您要研究的是
Reduce
,参数
acculate
设置为
TRUE
谢谢,听起来很有希望,我会试试。谢谢。两样都有很好!
data$y <- Reduce(function(y,x) ifelse(x > y, y+2, y-1)
                 , data$x[-1], data$y[1], accumulate = TRUE)
data$y
# [1]  0  2  4  3  5  7  6  5  7  9  8  7  6  8 10
data$y <- Reduce(function(y,x) if(x > y) y+2 else y-1
                 , data$x[-1], data$y[1], accumulate = TRUE)