2016-08-03 19 views
3

ich folgende Daten habe,in dplyr mit dem Maximalwert des Datums zusammenfassen - R

data 

date   ID  value1  value2 
2016-04-03  1   0    1 
2016-04-10  1   6    2 
2016-04-17  1   7    3 
2016-04-24  1   2    4 
2016-04-03  2   1    5 
2016-04-10  2   5    6 
2016-04-17  2   9    7 
2016-04-24  2   4    8 

Jetzt habe ich von ID gruppieren möge und den Mittelwert von value2 und aktuellen Wert von value1 finden. Letzter Wert in dem Sinne, ich möchte den Wert des spätesten Datums erhalten, d.h. hier möchte ich den Wert1 für den entsprechenden Wert von 2016-04-24 für jede IDs erhalten. Meine Ausgabe soll wie seine

ID  max_value1  mean_value2 
1    2    2.5 
2    4    6.5 

Im Folgenden ist der Befehl, den ich verwende,

data %>% group_by(ID) %>% summarize(mean_value2 = mean(value2)) 

Aber ich bin nicht sicher, wie die ersten zu tun. Kann mir jemand helfen, den letzten Wert von value1 zu erhalten, während ich in dplyr zusammenfasse?

Antwort

4

Ein Weg wäre der folgende. Meine Annahme ist, dass date ein Datumsobjekt ist. Sie möchten die Reihenfolge des Datums für jede ID mit arrange anordnen. Dann gruppieren Sie die Daten nach ID. In summarize können Sie last() verwenden, um den letzten Wert1 für jede ID zu übernehmen.

arrange(data,ID,date) %>% 
group_by(ID) %>% 
summarize(mean_value2 = mean(value2), max_value1 = last(value1)) 

#  ID mean_value2 max_value1 
# <int>  <dbl>  <int> 
#1  1   2.5   2 
#2  2   6.5   4 

DATA

data <- structure(list(date = structure(c(16894, 16901, 16908, 16915, 
16894, 16901, 16908, 16915), class = "Date"), ID = c(1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L), value1 = c(0L, 6L, 7L, 2L, 1L, 5L, 9L, 
4L), value2 = 1:8), .Names = c("date", "ID", "value1", "value2" 
), row.names = c(NA, -8L), class = "data.frame") 
+3

Ohne Anordnen Sie abwechselnd 'wert1 tun könnte [which.max (Datum)]', aber das ist nicht sehr dplyrish. – Frank

+0

@Frank Sicher Sache. Das wird auch tun. :) – jazzurro

1

Sie können dies die Funktion nth in dplyr mit tun, die die n-te Wert eines Vektors findet.

data %>% group_by(ID) %>% 
summarize(max_value1 = nth(value1, n = length(value1)), mean_value2 = mean(value2)) 

Dies basiert auf der Annahme, dass die Daten nach dem Datum, wie in dem Beispiel angeordnet werden; Verwenden Sie andernfalls die Anordnung wie oben beschrieben.

2

Hier ist eine Option mit data.table

library(data.table) 
setDT(data)[, .(max_value1 = value1[which.max(date)], 
         mean_value2 = mean(value2)) , by = ID] 
# ID max_value1 mean_value2 
#1: 1   2   2.5 
#2: 2   4   6.5 
Verwandte Themen