dplyr:如何处理多个值

chi*_*van 5 r dplyr summarize

我有一个数据帧,返回2组相同的分钟.如何处理达到我的预期产量?

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
                 ")
Run Code Online (Sandbox Code Playgroud)

我尝试下面的代码

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

我越来越:

错误:期望单个值

我想要输出如下.

    xxx  yyyy Topcomp
  <int> <int>  <fctr>
1     1     1    aaa,bbb
2     2     0     ddd
Run Code Online (Sandbox Code Playgroud)

aic*_*hao 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
Run Code Online (Sandbox Code Playgroud)

您收到错误是因为which返回了两个值,因此当您需要单个Company值时,您的子集具有两个值summarise.与之toString类似的是,它将两个值折叠为由逗号分隔的字符串.pastecollapse=","

另外,正如alistaire在他对另一个答案的评论中指出的那样,你不需要cwhich,所以这可以简化为:

final= df %>%
  group_by(xxx,yyyy) %>%
    summarise(Topcomp=toString(Company[min(cnt)==cnt]))
Run Code Online (Sandbox Code Playgroud)


Ric*_*ord 5

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

df %>%
  group_by(xxx,yyyy) %>%
  summarise(Topcomp = paste(Company[min(cnt) == cnt], collapse = ","))
Run Code Online (Sandbox Code Playgroud)