Заполните пропущенные значения (nacof / nocb) в столбце символов группой - PullRequest
1 голос
/ 30 апреля 2020

Скажите, что у меня есть такой набор данных:

   Object       date date_data
 1:      N       <NA>          
 2:      A       <NA>          
 3:      A       <NA>          
 4:      A 2020-01-01 something
 5:      B       <NA>          
 6:      B       <NA>          
 7:      B 2020-01-01 something
 8:      C       <NA>          
 9:      C       <NA>          
10:      C 2020-01-01 something

Генерируется

example <- data.table(Object = rep(LETTERS[1:3], each=3), date = as.Date(rep(c(NA,NA,"2020-01-01"),3)), date_data = rep(c("","","something")))
example <- rbind(list(Object="N", date=as.Date(NA), date_data = ""), example)

Я знаю, что могу заполнить пропущенные даты для каждой группы, используя nafill:

example[, date:= nafill(date,"nocb"), by=Object]
    Object       date date_data
 1:      N       <NA>          
 2:      A 2020-01-01          
 3:      A 2020-01-01          
 4:      A 2020-01-01 something
 5:      B 2020-01-01          
 6:      B 2020-01-01          
 7:      B 2020-01-01 something
 8:      C 2020-01-01          
 9:      C 2020-01-01          
10:      C 2020-01-01 something

Я хотел бы заполнить столбец date_data так же, как столбец даты. Я не могу сделать это с параметром nafill объекта данных, так как он не работает со значениями символов.

Каким будет простой обходной путь? Я видел похожие вопросы, но не нашел ни одного, относящегося к той же проблеме

Редактировать

@ data.table Ронака Шаха для исходного примера. Но если я изменяю его на

example <- data.table(Object = c(rep("A",6), rep("B",3)), date = as.Date(rep(c(NA,NA,"2020-01-01"),3)), date_data = rep(c("","","something")))
example <- rbind(list(Object="N", date=as.Date(NA), date_data = ""), example)


   Object       date date_data
 1:      N       <NA>          
 2:      A       <NA>          
 3:      A       <NA>          
 4:      A 2020-01-01 something
 5:      A       <NA>          
 6:      A       <NA>          
 7:      A 2020-01-01 something
 8:      B       <NA>          
 9:      B       <NA>          
10:      B 2020-01-01 something

na.fill больше не работает, я получаю сообщение об ошибке: Поставлено 4 элемента для назначения группе 2 размера 6 в столбце «date_data». Длина RHS должна быть либо 1 (допустимы отдельные значения), либо точно соответствовать длине LHS. Если вы хотите sh «переработать» RHS, пожалуйста, явно используйте rep (), чтобы прояснить это намерение читателям вашего кода.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Вы можете заменить пустые значения на NA и использовать zoo::na.locf.

library(data.table)

example[, date_data := zoo::na.locf(replace(date_data, date_data == "", NA)), Object]
example

#   Object       date date_data
# 1:      N       <NA>          
# 2:      A 2020-01-01 something
# 3:      A 2020-01-01 something
# 4:      A 2020-01-01 something
# 5:      B 2020-01-01 something
# 6:      B 2020-01-01 something
# 7:      B 2020-01-01 something
# 8:      C 2020-01-01 something
# 9:      C 2020-01-01 something
#10:      C 2020-01-01 something

и аналогично, используя tidyr s fill:

library(dplyr)

example %>%
  mutate(date_data = replace(date_data, date_data == "", NA)) %>%
  group_by(Object) %>%
  tidyr::fill(date_data, .direction = "up")
1 голос
/ 01 мая 2020

Другая опция, использующая data.table, применяемая ко всем типам столбцов одновременно:

#change empty string to NAs if there are more columns, use set
example[date_data=="", date_data := NA_character_]

cols <- c("date", "date_data")
example[, (cols) := lapply(.SD, 
      function(x) x[nafill(replace(seq.int(.N), is.na(x), NA_integer_), "nocb")]), 
  Object, .SDcols=cols]
...