1
votes

Comment obtenir une dernière ligne pour chaque ID en fonction d'un horodatage

J'ai besoin de lignes avec les dernières valeurs de temps pour chaque groupe. J'ai plusieurs lignes et colonnes. Les données d'entrée ressemblent à:

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

J'ai besoin des résultats comme:

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

J'ai déjà examiné la solution disponible sur community.rstudio .com / t / replacement-all-null-values-in-a-dataset-code-issue / 11285

J'ai essayé

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

Aussi, J'ai essayé de convertir la colonne de temps en horodatage par

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

Mais DF_time renvoie NA

Le premier code renvoie une donnée ( DF_filter ) ayant 0 obs. et 6 variables. Veuillez aider.


1 commentaires

Vous pouvez trier par date puis utiliser last de dplyr


3 Réponses :


1
votes
DF_filter <- DF %>% 
  inner_join((DF %>% group_by(ID) %>% summarise(Time=max(Time))),
             by=c('ID'= 'ID', 'Time' = 'Time'))

0 commentaires

3
votes

une approche data.table

exemple de données

#    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

code

#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]

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 = "\"")


2 commentaires

Cela fonctionne mais je ne sais pas pourquoi mais il manque une ligne. Par exemple les données filtrées devraient avoir jusqu'à 2560 lignes (lorsqu'elles sont calculées à l'aide du commentaire de @ clemsang sur la question d'origine), mais en utilisant votre code, j'obtiens 2559 lignes.


Vous devriez obtenir une ligne par ID unique. Vérifiez donc length (unique (DF $ ID)) . Que renvoie-t-il?



2
votes

Après avoir formaté correctement la variable Time:

Utilisation de base:

merge(aggregate(Time ~ ID, data = df, FUN = max), df)

Alternativement:

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


0 commentaires