Заполните пропущенные значения из переменной значениями из ближайшего момента времени в R - PullRequest
0 голосов
/ 08 января 2020

У меня есть данные, которые выглядят так (но для 14 миллионов человек)

Это значение каждого человека для MB в данном квартале (qtr). Если qtr == 20091001, это период с октября по декабрь 2009 года.

df <- data.frame(
  ID = rep(c('ABC1234', 'CED6723', 'GHB9876', "MNR4444", "FRE9823"), 4),
  qtr = c(rep('20090101', 5), rep('20090401', 5),rep('20090701', 5),rep('20091001', 5)),
  MB = c('0000000', "1234567", "5678910", "1234567", 
         "9384756", "3456789", NA, '0000000',
         "7394857", '0000000', '0000000', '0000000',
         "9485967", "9485967", "9485967", '0000000',
         '0000000', NA, '4545455', '1987656'
         )
)

Что я хочу сделать, это заменить значение MB, где оно равно NA или == '0000000', на самое последнее значение MB.

Правила будут такими: если MB равен NA или 0 в 20091001, я хочу, чтобы значение приходило из 20090701 (если заполнено), затем из 20090401 (если заполнено), а затем из 20090101.

Если MB равен NA или 0 в 20090701, я хочу, чтобы значение приходило из 20090401 (если заполнено), затем 20090101 (если заполнено), затем 20091001.

Если MB равно NA или 0 в 20090401, Я хочу, чтобы значение пришло из 20090101 (если заполнено), затем из 20090701 (если заполнено), затем из 20091001.

Если MB равно NA или 0 в 20090101, я хочу, чтобы это значение пришло из 20090401 (если заполнено) , затем 20090701 (если заполнено), затем 20091001.

Мой идеальный вывод выглядит следующим образом

df2 <- data.frame(
  ID = rep(c('ABC1234', 'CED6723', 'GHB9876', "MNR4444", "FRE9823"), 4),
  qtr = c(rep('20090101', 5), rep('20090401', 5),rep('20090701', 5),rep('20091001', 5)),
  MB = c("1234567", "1234567", "5678910", "1234567", 
         "9384756", "3456789", "3456789", "3456789",
         "7394857", "7394857", "7394857", "7394857",
         "9485967", "9485967", "9485967", "9485967",
         '4545455', '4545455', '4545455', '1987656'
  )
)

Я видел этот ответ r - скопировать пропущенные значения из других переменных Это для данных в широком формате. Нужно ли конвертировать мои данные в широкоформатный формат и изменить метки переменной qtr на 1, 2, 3, 4? Или есть способ сделать это на моем фрейме данных как есть?

Спасибо.

Ответы [ 2 ]

1 голос
/ 08 января 2020

Таким образом, вы можете сделать это, используя функцию заполнения tidyr, но сначала я проверил, является ли значение нулями, затем я сделал это NA, потому что заливка фокусируется на значениях NA только следующим образом;

library(dplyr)
library(tidyr)

# Creating dataframe
df <- data.frame(
  ID = rep(c('ABC1234', 'CED6723', 'GHB9876', "MNR4444", "FRE9823"), 4),
  qtr = c(rep('20090101', 5), rep('20090401', 5),rep('20090701', 5),rep('20091001', 5)),
  MB = c('0000000', "1234567", "5678910", "1234567", 
         "9384756", "3456789", NA, '0000000',
         "7394857", '0000000', '0000000', '0000000',
         "9485967", "9485967", "9485967", '0000000',
         '0000000', NA, '4545455', '1987656'),
  stringsAsFactors = FALSE
)

df2 <-
  df %>%
  # If MB is zeros then convert it into NA
  mutate(MB = ifelse(as.numeric(MB) == 0, NA_character_, MB)) %>%
  # Fill automatically fills NA data with closest values
  # given the direction of the filling
  # you can change the direction as you like
  # To know more about it ?fill
  fill(MB, .direction = "downup")

df2

# ID      qtr      MB
# ABC1234 20090101 1234567
# CED6723 20090101 1234567
# GHB9876 20090101 5678910
# MNR4444 20090101 1234567
# FRE9823 20090101 9384756
# ABC1234 20090401 3456789
# CED6723 20090401 3456789
# GHB9876 20090401 3456789
# MNR4444 20090401 7394857
# FRE9823 20090401 7394857
0 голосов
/ 08 января 2020

Мы можем использовать zoo::na.locf при условии, что данные упорядочены по qtr, как показано в общих данных.

df$MB <- as.numeric(as.character(df$MB))
df$MB <- replace(df$MB, df$MB == 0, NA)
df$MB <- zoo::na.locf(df$MB, fromLast = TRUE)

df
#        ID      qtr      MB
#1  ABC1234 20090101 1234567
#2  CED6723 20090101 1234567
#3  GHB9876 20090101 5678910
#4  MNR4444 20090101 1234567
#5  FRE9823 20090101 9384756
#6  ABC1234 20090401 3456789
#7  CED6723 20090401 7394857
#8  GHB9876 20090401 7394857
#9  MNR4444 20090401 7394857
#10 FRE9823 20090401 9485967
#11 ABC1234 20090701 9485967
#12 CED6723 20090701 9485967
#13 GHB9876 20090701 9485967
#14 MNR4444 20090701 9485967
#15 FRE9823 20090701 9485967
#16 ABC1234 20091001 4545455
#17 CED6723 20091001 4545455
#18 GHB9876 20091001 4545455
#19 MNR4444 20091001 4545455
#20 FRE9823 20091001 1987656
...