2015-04-12 3 views
5
>ID<-c('A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C') 
>WK<-c(1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5) 
>NumSuccess<-c(0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 3) 
>Data<-data.frame(ID, WK, NumSuccess) 

I auf dem Wert in „NumSuccesses“ data.frame „Data2“ zugrunde, eine Teilmenge zu erzeugen versuchen, die in dem Max-Wert entspricht " WK "gruppiert nach" ID ". Der resultierende Datenrahmen sollte wie folgt aussehen:R Subset data.frame von max-Wert eines Vektors und gruppierte von einer anderen

>ID<-c('A','B','C') 
>WK<-c(3, 3, 5) 
>NumSuccess<-c(2, 1, 3) 
>Data2<-data.frame(ID, WK, NumSuccess) 

Antwort

7

Dies könnte in mehr als einer Weise erfolgen. Wenn es Bindungen für 'WK' gibt, Maximalwert für jede 'ID' und alle Zeilen mit der maximalen 'WK' wollen, kann es nützlich sein, filter mit der logischen Bedingung (WK==max(WK)) nach der Gruppierung durch die 'ID'.

library(dplyr) 
Data %>% 
     group_by(ID) %>% 
     filter(WK==max(WK)) 
# ID WK NumSuccess 
#1 A 3   2 
#2 B 3   1 
#3 C 5   3 

Wenn es ein einziger ‚max‘ Wert für ‚WK‘ pro ‚ID‘, können wir which.max verwenden oder arrange verwenden den Datensatz von ‚WK‘ zu bestellen für jede ‚ID‘

Data %>% 
     group_by(ID) %>% 
     slice(which.max(WK)) 
    #  ID WK NumSuccess 
    #1 A 3   2 
    #2 B 3   1 
    #3 C 5   3 

Data %>% 
     group_by(ID) %>% 
     arrange(-WK) %>% 
     slice(1) 

ähnliche Ansätze in data.table sind

library(data.table) 
setDT(Data)[, .SD[max(WK)==WK], ID] 
setDT(Data)[, .SD[which.max(WK)], ID] 
setkey(setDT(Data), WK)[, .SD[.N], ID] 

Oder wir ave von base R

verwenden können
Data[with(Data, ave(WK, ID, FUN=max)==WK),] 
+0

@ user3594490 Kein Problem. Schön, dass es für dich funktioniert – akrun

Verwandte Themen