2017-07-04 3 views
1

Ich habe einen Datenrahmen dfeine Zeile auswählen, basierend auf zwei weiteren Säulen R

df = data.frame(L = rep(letters[1:6], each = 2), 
       M = rep(letters[7:12]), 
       freq = sample(c(5, 10), replace = FALSE)) 

    L M freq 
1 a g 5 
2 a h 10 
3 b i 5 
4 b j 10 
5 c k 5 
6 c l 10 
7 d g 5 
8 d h 10 
9 e i 5 
10 e j 10 
11 f k 5 
12 f l 10 

ich die am häufigsten M für jeden L.

In diesem Beispiel wählen wollen würde die Ausgabe zeigen:

h, j, l, h, j, l 

Frequenz ist nicht unbedingt jeder zweite Wert im eigentlichen Problem.

Wie kann ich das einfach machen?

Ich habe versucht, eine tapply Ansatz, aber hier stecken bleiben, weil dies scheint nur für Variablen gelten und kann nicht verwendet werden, um eine Teilmenge Datenrahmen Subset. (Dies führte nicht alles in der Nähe, damit ich nicht den Ansatz schreiben)

+2

Eine Basis-R-Option zusätzlich zu denen aus der verknüpften Frage wäre 'mit (df [Reihenfolge (-df $ freq),], M [! Dupliziert (L)]) ' –

+0

@docendodiscimus vielleicht Antwort im Zielbeitrag hinzufügen/aktualisieren? – zx8754

Antwort

1

Eine andere Lösung mit dplyr

df %>% group_by(L) %>% top_n(1, freq) %>% .$M 
#### [1] h j l h j l 

schließlich Umwandlung in Zeichen am Ende ...

+3

Ab 'dplyr' v0.7 können Sie den idiomatischen' ...%>% Pull (M) 'anstelle von' ...%>%. $ M' verwenden –

2

Wir tun können

library(data.table) 
setDT(df)[, .(M = M[which.max(freq)]), L] 
# L M 
#1: a h 
#2: b j 
#3: c l 
#4: d h 
#5: e j 
#6: f l 

Oder order das ‚Freq‘ und wählen Sie den ersten ‚M‘ für jede 'L'

setDT(df)[order(-freq), .(M = M[1]) , L] 
Verwandte Themen