Векторизованное решение для использования предыдущего значения в столбце при определенных условиях. - PullRequest
0 голосов
/ 18 января 2019

Это, вероятно, просто, но я не смог найти векторизованного решения для этого, кроме неуклюжей петли for.

df <- tibble(a=c(1,2,3,4,3,2,5,6,9), b=c(1,2,3,4,4,4,5,6,9))

Столбец a должен непрерывно увеличиваться и выглядеть как столбец b. Таким образом, всякий раз, когда следующее значение в a меньше предыдущего значения в a, вместо него следует использовать предыдущее значение.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Использование cummax() от базы R:

df[["b1"]] <- cummax(df[["a"]])

> df
  a b b1
1 1 1  1
2 2 2  2
3 3 3  3
4 4 4  4
5 3 4  4
6 2 4  4
7 5 5  5
8 6 6  6
9 9 9  9

Использование более синтаксиса dplyr:

df %>% 
  mutate(b1 = cummax(a))
0 голосов
/ 18 января 2019

Мы можем использовать lag и fill от tidyverse

library(tidyverse)

df %>%
 mutate(b1 = replace(a, a < lag(a), NA)) %>%
 fill(b1)


#      a     b    b1
#  <dbl> <dbl> <dbl>
#1     1     1     1
#2     2     2     2
#3     3     3     3
#4     4     4     4
#5     3     4     4
#6     2     4     4
#7     5     5     5
#8     6     6     6
#9     9     9     9

Логика заключается в том, что мы заменяем значения в a на NA, где предыдущее значение больше следующего, а затем используем fill для замены этих NA s последним значением, отличным от NA.

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