2016-09-14 3 views
5

У меня есть dataframe, который возвращает 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))]) 

Im получение:

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)%>% summary (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 требует отдельного значения. toString аналогичен paste с collapse="," тем, что он сворачивает два значения в строку, разделенную запятой.

Кроме того, как alistaire отметил в своем комментарии для другого ответа, вам не нужно c и which, так что это может быть упрощено:

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

Спасибо, что сработало –

Смежные вопросы