2016-09-14 76 views
5

我有一個數據幀,它返回2組相同的最小值。如何處理以達到我的預期產出?dplyr:如何處理多個值

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

我想下面的代碼

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

即時得到:

Error: expecting a single value

我想有輸出像下面。

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

最靈活的解決方案是一個列表列,即'df%>%group_by(xxx,yyyy)%>%summarize(Topcomp = list(Company [cnt == min(cnt)]))',儘管他們需要一些練習來處理。 – alistaire

+0

另外,你可以在下面評論'c'和'which',因爲他們在這裏沒有做任何事情。 – alistaire

回答

5

你可以使用paste(..., collapse = ",")

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

你可以拿出'c'和'which'。 – alistaire

+0

謝謝,它的工作... –

6

你應該這樣做:

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 

你都拿到了錯誤,因爲which返回兩個值,使您的Company子集有兩個值summarise需要一個值。 toStringpastecollapse=","類似,因爲它將兩個值摺疊爲由逗號分隔的字符串。

而且,alistaire在他對對方的回答評論指出的那樣,你不需要cwhich,所以這可以簡化爲:

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

感謝它的工作 –