2017-01-30 3 views
0

Я следующие кадра данных:Заливка пропущенные даты в R

df <- structure(list(Jmbg = c("0402977385033", "0402977385033", "0402977385033", 
"0402977385033", "0402977385033", "0402977385033", "0402977385033", 
"0402977385033", "0402977385033", "0402977385033", "0402977385033", 
"0402977385033", "0402977385033", "0402977385033", "0402977385033", 
"0402977385033", "0402977385033", "0402977385033", "2607954335134", 
"2607954335134", "2607954335134", "2607954335134", "2607954335134" 
), DatumOd = structure(c(11260, 11457, 11503, 11603, 11696, 11826, 
11875, 12013, 12043, 12133, 12225, 12225, 12317, 12408, 12499, 
13878, 14425, 16203, 10915, 11687, 12372, 13878, 15217), class = "Date"), 
    DatumDo = structure(c(11455, 11502, 11520, 11695, 11800, 
    11941, 12012, 12042, 12132, 12224, 12225, 12316, 12407, 12498, 
    13877, NA, NA, NA, 11686, 12371, 13877, NA, NA), class = "Date")), row.names = c(NA, 
-23L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), vars = list(
    Jmbg), drop = TRUE, indices = list(0:17, 18:22), group_sizes = c(18L, 
5L), biggest_group_size = 18L, .Names = c("Jmbg", "DatumOd", 
"DatumDo"), labels = structure(list(Jmbg = c("0402977385033", 
"2607954335134")), row.names = c(NA, -2L), class = "data.frame", vars = list(
    Jmbg), drop = TRUE, indices = list(c(0L, 2L, 3L, 4L, 5L, 
6L, 8L, 9L, 10L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 22L), 
    c(1L, 7L, 11L, 20L, 21L)), group_sizes = c(18L, 5L), biggest_group_size = 18L, .Names = "Jmbg")) 

Первый столбец ID. Второй столбец - это дата начала события и третьего столбца, когда событие завершено. Как вы можете видеть, в столбце Datumdo есть некоторые недостающие значения. Я хочу заполнить эти отсутствующие значения следующим образом: Если значение отсутствует, но дата DatumOd является последней для id, она должна оставаться NA. Если дата отсутствует, и это не последняя дата DatumOd, должна быть следующая дата от DatumOd столбец минус один день.

Я попытался с dplyr:

df_2 <- df %>% 
    dplyr::group_by(Jmbg) %>% 
    dplyr::mutate(novi_date = ifelse(is.na(DatumDo) & DatumOd != max(DatumOd), "test", DatumDo)) 

но вместо теста должна быть дата следующего из DatumOd колонки для этого идентификатора. Например, для последнего «теста» должна быть дата 2011-08-30. Конечно, вы можете использовать любой другой пакет (data.table ...)

+0

Что-то вроде этого? http://stackoverflow.com/a/16791674/322912 –

+0

Я думаю, что это не та же проблема, потому что я должен использовать информацию из 2 столбцов не только так, как в примере, который вы связали. – Mislav

+0

не может воспроизвести это на моей машине – shayaa

ответ

1

Вот ответ, используя data.table. Он использует функцию shift, чтобы найти ведущую дату (минус один день) для каждой строки и присваивает ее новому столбцу, dayBeforeNext, по идентификатору. Оттуда ifelse присваивает новые даты другой новой переменной в зависимости от того, существует ли дата в DatumDo.

Мне нужно было преобразовать даты в символы перед их назначением, а затем вернуться к дате, поскольку, по-видимому, существует ошибка, определяющая типы дат в операциях ifelse по ссылке data.table.

setDT(df) 
df[, dayBeforeNext := as.character(shift(DatumOd, type='lead')-1), by=Jmbg] 
df[, DatumDo := as.character(DatumDo)] 

df[, new := ifelse(is.na(DatumDo), dayBeforeNext, DatumDo)] 

df[, new := as.Date(new)] 

Ваш новый `data.table будет иметь дополнительные столбцы, так что вы можете переназначить те/удалить их, как вы считаете нужным.

+0

Есть некоторые проблемы с форматом дат. Я succesfuly нашел решение с помощью dplyr: 'df_2 <- df %>% dplyr :: group_by (Jmbg)%>% dplyr :: мутировать (novi_date = IfElse (is.na (DatumDo) & DatumOd = макс (DatumOd), dplyr! :: lead (as.numeric (DatumOd), 1L, order_by = as.numeric (DatumOd)) - 1, as.numeric (DatumDo)))%>% dplyr :: organiz (Jmbg, DatumOd) df_2 $ novi_date <- as.Date (as.numeric (df_2 $ novi_date), origin = "1970-01-01") '. Я просто могу использовать лаг. – Mislav

+0

Проблемы с форматом дат в моем ответе или в вопросе, о котором я говорил? – moman822

+0

Да, были проблемы с форматами дат, если я использовал ваш код. переменная 'DatumDo' была меньше, чем' DatumOd', даже если я использовал свинец вместо задержки в функции сдвига. – Mislav

Смежные вопросы