2016-09-14 16 views
5

Mam ramkę danych, która zwraca 2 grupy na tę samą min. Jak można go obsłużyć, aby osiągnąć oczekiwany wynik?dplyr: Obsługa wielu wartości

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 
       ") 

Próbowałem poniżej kod

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

Im uzyskiwanie:

Error: expecting a single value

chcę mieć wyjście jak poniżej.

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

najbardziej elastyczne rozwiązania jest kolumna lista , tzn. 'df%>% group_by (xxx, yyyy)%>% summary (Topcomp = list (Company [cnt == min (cnt)]))', choć wymagają one trochę praktyki do pracy. – alistaire

+0

Możesz także odciąć "c" i "co", tak jak to skomentowałem poniżej, ponieważ nic tutaj nie robią. – alistaire

Odpowiedz

5

można użyć paste(..., collapse = ",")

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

Możesz wyjąć 'c' i' which'. – alistaire

+0

Dzięki, zadziałało ... –

6

powinien to zrobić:

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 

Byłaś uzyskiwanie błąd ponieważ which powrócił dwie wartości tak, że podzbiór Company ma dwie wartości, gdy summarise wymaga pojedynczej wartości. Model toString jest podobny do paste z collapse=",", ponieważ składa dwie wartości w łańcuchu oddzielonym przecinkiem.

Ponadto, jak wskazano w alistaire jego komentarz do drugiej odpowiedzi, nie trzeba się c i which, więc można uprościć do:

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

Dzięki temu działało –