Заменить, если отсутствует последнее значение группы, с помощью переменной POSIXct - PullRequest
0 голосов
/ 29 мая 2019

Я хотел бы заменить последнее значение переменной enddt значением «2019-03-31 23:59:59», если оно отсутствует.

ID  stdt                enddt               goal 
1   11/21/2018 7:11     12/31/2018 23:59    12/31/2018 23:59
1   1/21/2019 0:00      1/22/2019 5:19      1/22/2019 5:19
1   1/22/2018 5:19                          3/31/2019 23:59
2   12/17/2018 16:49    3/31/2018 21:59     3/31/2018 21:59
2   3/31/2018 22:00     12/21/2018 23:05    12/21/2018 23:05
2   12/21/2018 23:05    1/16/2019 8:32      1/16/2019 8:32

Моя попытка не сработала. Он генерирует одно значение для каждого идентификатора (первое значение enddt).

df <- df %>%
  group_by(ID) %>%
  mutate(goal= ifelse(is.null(last(enddt)), "2019-03-31 23:59:59", enddt)) %>%
  ungroup()

hh3$goal<- as.POSIXct(hh3$goal, origin = "1960-01-01")

Моя переменная даты / времени является классом "POSIXct" и "POSIXt". Возможно, мне нужно изменить класс этой переменной с помощью chron ??

Заранее спасибо. Марвин

1 Ответ

0 голосов
/ 30 мая 2019

Есть две забавные вещи, с которыми вы сталкиваетесь.

  1. ifelse() в дату часто приводит к неожиданным результатам.Поскольку enddt имеет класс POSIXct, новый результат goal также должен иметь его.
  2. в операторе ifelse(), вы спрашиваете, является ли 1 вещь ИСТИННОЙ, а затем идти построчнои генерировать вывод.Это также может создавать неожиданные предупреждения и результаты.Обойти это можно, создав вспомогательный столбец, как я сделал ниже (missing_date).Другой способ исправить это - что-то вроде ifelse(rep(is.na(last(enddt)), n()), as.POSIXct("2019-03-31 23:59:59"), enddt), но я думаю, что за вспомогательным столбцом легче следовать.

Посмотрите, поможет ли это вам

library(tidyverse)
library(lubridate) #mdy_hm function

df <- data.table::fread(
  "ID   stdt    enddt   goal
  1 11/21/2018 7:11 3/31/2019 23:59 3/31/2019 23:59
  1 11/21/2018 7:11 11/22/2018 5:19 11/22/2018 5:19
  1 11/22/2018 5:19     3/31/2018 23:59
  2 12/17/2018 16:49    3/31/2019 23:59 3/31/2019 23:59
  2 12/17/2018 16:49    12/21/2018 23:05    12/21/2018 23:05
  2 12/21/2018 23:05    1/16/2019 8:32  1/16/2019 8:32"
  ) %>% 
  mutate_at(vars(c(ends_with("dt"), "goal")), mdy_hm)


df %>%
  group_by(ID) %>%
  mutate(
    # this puts a T/F in every column, note, is.na vs is.null
    missing_date = is.na(last(enddt)),
    goal = ifelse(missing_date, as.POSIXct("2019-03-31 23:59:59"), enddt)
  ) %>% 
  ungroup() %>% 
  # 1970 instead of 1960
  mutate(goal = as.POSIXct(goal, origin = "1970-01-01")) %>% 
  # remove this column
  select(-missing_date)

enter image description here

...