заменить для l oop с картой? - PullRequest
       4

заменить для l oop с картой?

3 голосов
/ 11 февраля 2020

Я хотел бы заменить следующее для -l oop ...

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 ))

Но, очевидно, мне это не удалось. Любая помощь будет высоко ценится.

Ответы [ 2 ]

4 голосов
/ 11 февраля 2020

Вы можете использовать пакет accumulate из purrr для последовательных операций:

data %>% 
  mutate( y = accumulate( .x = x[-1],
                          .init = 0,
                          .f = function(y,x) if_else(x > y, y + 2, y - 1) ) 
  )
2 голосов
/ 11 февраля 2020

В случае, если вас также интересует решение base с использованием Reduce, как уже предложено @Sotos в комментариях:

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...