Как получить последнюю строку для каждого идентификатора на основе отметки времени - PullRequest
1 голос
/ 17 мая 2019

Мне нужны строки с последними значениями времени для каждой группы.У меня есть несколько строк и столбцов.Входные данные выглядят так:

view(DF)

ID  Value1  Value2  Value3  Value4  Time
1   1   7   13  19  2013-11-15 21:12:03:337
1   2   8   14  20  2013-12-23 15:12:01:227
2   3   9   15  21  2014-12-07 14:37:01:127
2   4   10  16  22  2013-12-12 05:23:01:239
3   5   11  17  23  2011-12-25 15:12:01:227
3   6   12  18  24  2011-12-25 15:12:02:227

Мне нужны результаты, такие как:

ID  Value1  Value2  Value3  Value4  Time
1   2   8   14  20  2013-12-23 15:12:01:227
2   3   9   15  21  2014-12-07 14:37:01:127
3   6   12  18  24  2011-12-25 15:12:02:227

Я уже рассмотрел решение, доступное на community.rstudio.com/t/replacing-all-null-values-in-a-a-datase-code-issue / 11285

Я пытался

DF_filter = DF%>% 
  group_by(ID) %>%
  slice(which.max(Time))

Кроме того, я пытался преобразовать столбец времени в метку времени как

DF_time <- strptime(x=as.character(DF$Time), format = "%y-%m-%d %H%M:S")

Но DF_time возвращает NA

Первый код возвращает данные (DF_filter), имеющие 0 obs.и 6 переменных.Пожалуйста, помогите.

Ответы [ 3 ]

3 голосов
/ 17 мая 2019

a data.table подход

образец данных

DT <- fread('ID  Value1  Value2  Value3  Value4  Time
1   1   7   13  19  "2013-11-15 21:12:03:337"
            1   2   8   14  20  "2013-12-23 15:12:01:227"
            2   3   9   15  21  "2014-12-07 14:37:01:127"
            2   4   10  16  22  "2013-12-12 05:23:01:239"
            3   5   11  17  23  "2011-12-25 15:12:01:227"
            3   6   12  18  24  "2011-12-25 15:12:02:227"', quote = "\"")

код

#first, set miliseconds correct by replacing the last : with a .
DT[, Time := gsub( "(.*)(:)([0-9]*$)", "\\1.\\3", Time)]
#now convert to POSIXct
DT[, Time := as.POSIXct( Time, format = " %Y-%m-%d %H:%M:%OS")]

#now, pull the max Time per group
DT[DT[, .I[which.max(Time)], by=ID]$V1]

выход

#    ID Value1 Value2 Value3 Value4                Time
# 1:  1      2      8     14     20 2013-12-23 15:12:01
# 2:  2      3      9     15     21 2014-12-07 14:37:01
# 3:  3      6     12     18     24 2011-12-25 15:12:02
2 голосов
/ 17 мая 2019

После форматирования переменной времени правильно:

Использование base:

do.call(rbind, lapply(
  split(df, df$ID),
  function(x) x[which.max(x$Time), ]
))

В качестве альтернативы:

merge(aggregate(Time ~ ID, data = df, FUN = max), df)
1 голос
/ 17 мая 2019
DF_filter <- DF %>% 
  inner_join((DF %>% group_by(ID) %>% summarise(Time=max(Time))),
             by=c('ID'= 'ID', 'Time' = 'Time'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...