用map替换for循环?
我想替换以下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 #
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)