2016-09-14 4 views
5

Ich habe einen Datenrahmen, die 2 Gruppen für die gleiche Minute zurückgeben. Wie kann es gehandhabt werden, um meine erwartete Ausgabe zu erreichen?dplyr: Wie mehrere Werte zu behandeln

df<- read.table(header=TRUE, 
       text=" 
       Company xxx yyyy zzzz cnt 
       abc  1  1 1  20 
       aaa  1  1 2  3 
       bbb  1  1 1  3 
       ddd  2  0 2  100 
       ") 

Ich habe versucht, unter Code

final= df %>% 
     group_by(xxx,yyyy) %>% 
     summarise(Topcomp=Company[c(which(min(cnt)==cnt))]) 

Im erhalten:

Error: expecting a single value

Ich möchte wie unten ausgegeben haben.

xxx yyyy Topcomp 
    <int> <int> <fctr> 
1  1  1 aaa,bbb 
2  2  0  ddd 
+0

Die flexibelste Lösung ist eine Liste Spalte , dh 'df%>% group_by (xxx, yyyy)%>% zusammenfassen (Topcomp = list (Firma [cnt == min (cnt)]))', obwohl sie ein wenig Übung brauchen, um damit zu arbeiten. – alistaire

+0

Auch können Sie 'c' und' which' herausschneiden, wie ich unten kommentierte, da sie hier nichts tun. – alistaire

Antwort

5

könnten Sie paste(..., collapse = ",")

df %>% 
    group_by(xxx,yyyy) %>% 
    summarise(Topcomp = paste(Company[min(cnt) == cnt], collapse = ",")) 
+0

Sie können das 'c' und' which' herausnehmen. – alistaire

+0

Danke, es hat funktioniert ... –

6

verwenden Sie sollten dies tun:

final= df %>% 
    group_by(xxx,yyyy) %>% 
    summarise(Topcomp=toString(Company[c(which(min(cnt)==cnt))])) 
##Source: local data frame [2 x 3] 
##Groups: xxx [?] 
## 
## xxx yyyy Topcomp 
## <int> <int> <chr> 
##1  1  1 aaa, bbb 
##2  2  0  ddd 

Sie haben den Fehler bekommen, weil which zwei Werte zurück, so dass Ihre Teilmenge von Company zwei Werte hat, wenn summarise erfordert einen einzelnen Wert. Die toString ist ähnlich wie paste mit collapse=",", in dem es die zwei Werte in eine durch das Komma getrennte Zeichenfolge zusammenfasst.

Auch als alistaire für die andere Antwort in seinem Kommentar darauf hingewiesen, Sie brauchen nicht auf die c und die which, so kann dies zu vereinfachen:

final= df %>% 
    group_by(xxx,yyyy) %>% 
    summarise(Topcomp=toString(Company[min(cnt)==cnt])) 
+1

Danke, es hat funktioniert –

Verwandte Themen