Невозможно заполнить 2 спекулятивных строки с помощью функции dplyr lag - PullRequest
0 голосов
/ 23 сентября 2018

Я использую R и R пакет dplyr.Я хочу во фрейме данных заполнить пропущенные значения из предыдущего значения строки (увеличить его на 1).Это работает хорошо, если у меня есть разрыв в один, но если есть 2 или более последовательных пропущенных значений, то у меня проблема.Допустим, у меня есть фрейм данных, и для некоторых строк его значения отсутствуют.

  id val1 val2
1  0    0    0
2  1    1    1
3  2   NA    NA
4  3    3    3
5  4   NA   NA
6  5   NA   NA
7  6    6    6

Здесь val2 - это увеличение, для которого я выполняю увеличение, а val1 - просто исходное значение.Для значений NA я хочу взять предыдущее значение строки и увеличить его на 1. Я использую пакет dplyr и функцию задержки.
Вот код:

library(dplyr)
tmp.data <- data.frame(id = c(0:6),val1 = c(0:6)) %>%
  mutate(
    val1 = ifelse( val1 %in% c(2,4:5),NA,val1),
    val2 = val1,
  ) 

tmp.data <- tmp.data %>%
  mutate(
    val2 = ifelse(
      is.na(val2),
      lag(val2) + 1,
      val2
      )
  )

1 Ответ

0 голосов
/ 23 сентября 2018

Решение 1a: Предполагается увеличение по сравнению с предыдущими пропущенными значениями, с 2 последовательными пропущенными строками

Using dplyr:

tmp.data %>%
  mutate(val2 = ifelse(is.na(val2), lag(val2) + 1, val2),
         val2 = ifelse(is.na(val2), lag(val2) + 1, val2))

Решение 1b: Предполагается увеличение по сравнению с предыдущим пропущенным значением (s), с N последовательными пропущенными строками

с использованием data.table, zoo и dplyr:

setDT(tmp.data)[, consec := seq_len(.N), by=rleid(val2)]

tmp.data %>%
  mutate(val2 = ifelse(is.na(val2), na.locf(val2) + consec, val2)) %>%
  select(-consec)

или записанными вместе:

tmp.data %>%
  group_by(rleid(val2)) %>%
  mutate(consec = seq_along(val2)) %>%
  ungroup() %>%
  mutate(val2 = ifelse(is.na(val2), na.locf(val2) + consec, val2)) %>%
  select(id, val1, val2)

Решение2: не предполагая увеличения по сравнению с предыдущими пропущенными значениями

с использованием dplyr и zoo:

tmp.data %>%
  mutate(val2 = ifelse(is.na(val2), na.locf(val2) + 1, val2))
...