2016-07-25 6 views

Antwort

0

A dplyr Lösung:

library(dplyr) 
df%>% group_by(ID) %>% filter(class !="e") %>%summarize(n()) 
+0

können Sie erklären, wie es funktioniert? – user3581800

+0

Sicher! dplyr hat den Pipe-Operator '%>%'. Es kann als "und dann" interpretiert werden. Also lesen Sie den Code wie folgt. Nehmen Sie Ihr df und gruppieren Sie dann nach einer id-Variablen und filtern Sie dann die Zeilen des df, die nicht zur Klasse "e" gehören, und fassen Sie sie dann nach der Anzahl in jeder Gruppe zusammen. – shayaa

2

Vielleicht dieses:

aggregate(rank~ID, df[as.character(df$class)<"e",], length) 

# ID rank 
#1 AA 2 
#2 AB 2 
#3 BB 1 

Als für das, was @ Richard Scriven in den Kommentaren darauf hingewiesen (danke dafür):

Vergleich von Strings in Zeichenvektoren ist lexicographic innerhalb der Strings die Sortierfolge des Lokals im Einsatz

Wenn wir Sys.getlocale() laufen, würden wir bekommen:

[1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United 
    States.1252;LC_MONETARY=English_United 
    States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252" 

Wir können das Gebietsschema festgelegt mit:

Sys.getlocale("LC_TIME") #LC_TIME for example 

Siehe ?locales für weitere Informationen.

+1

Das ist genau das, woran ich auch gedacht habe. OP hüte dich vor lexikographischer Ordnung in Bezug auf das Gebietsschema, wie in 'help (<<)) erwähnt. –

0

Wir können auch data.table verwenden. Konvertieren Sie den 'data.frame' in 'data.table' (setDT(df)), gruppiert nach 'ID', geben Sie i mit dem logischen Ausdruck (class != "e") an und ermitteln Sie die Anzahl der Zeilen (.N).

library(data.table) 
setDT(df)[class != "e",.(N = .N), by = ID] 
# ID N 
#1: AA 2 
#2: AB 2 
#3: BB 1