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.
3 Réponses :
DF_filter <- DF %>%
inner_join((DF %>% group_by(ID) %>% summarise(Time=max(Time))),
by=c('ID'= 'ID', 'Time' = 'Time'))
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 = "\"")
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?
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), ] ))
Vous pouvez trier par date puis utiliser
lastde dplyr