【问题标题】:dplyr: How to handle multiple valuedplyr:如何处理多个值
【发布时间】:2017-01-22 18:53:10
【问题描述】:

我有一个数据框,它在同一分钟内返回 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
                 ")

我试过下面的代码

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

我得到:

错误:需要单个值

我想要如下所示的输出。

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

【问题讨论】:

  • 最灵活的解决方案是列表列,即df %&gt;% group_by(xxx, yyyy) %&gt;% summarise(Topcomp = list(Company[cnt == min(cnt)])),尽管它们需要一些练习才能使用。
  • 另外,你可以删除 cwhich,正如我在下面评论的那样,因为他们在这里没有做任何事情。

标签: r dplyr summarize


【解决方案1】:

你应该这样做:

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 返回了两个值,因此当summarise 需要一个值时,您的Company 子集有两个值。 toStringpastecollapse="," 的相似之处在于它将两个值折叠成一个用逗号分隔的字符串。

此外,正如 alistaire 在他对另一个答案的评论中指出的那样,您不需要 cwhich,因此可以将其简化为:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你可以取出cwhich
    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2015-05-26
    • 2018-10-16
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多