首页 文章

如何通过在一列上分组和连接来折叠数据帧

提问于
浏览
0

我有一个包含20列的数据框 . 最后一列是文本字段 . 我想按前19列分组,并连接最后一个文本列的值 . 我一直试图通过使用dplyr实现这一目的,如下所示:

mydf %>%
group_by(col1, col2, col3, ... col19) %>%
summarise(alltasks = c(col20))

但这不起作用并返回此错误消息:

eval中的错误(替换(expr),envir,enclos):期望单个值

我究竟做错了什么?

1 回答

  • 5

    正如@thelatemail所指出的,你需要返回一个值,而不是所有值的向量 . 这是一个如何做到这一点的例子:

    dots = lapply(paste0("col", 1:19), as.symbol)
    
    mydf %>%
      group_by_(.dots=dots) %>%
      summarise(alltasks = paste(col20, collapse=", "))
    

    summarise 行的更改是将 col20 中的所有值粘贴到单个字符串中的方式 . 我使用了逗号空间分隔符,但您当然可以将其更改为您喜欢的任何内容 . dots 业务只是一种更简单的方法来组合所有分组变量而无需键入每个变量 .

    如果 mydf 的名称不是那么规则,您可以使用简单的 paste 函数来生成它们,其他选项将是,例如:

    dots = lapply(names(mydf)[1:19], as.symbol)
    

    要么

    dots = lapply(names(mydf)[-grep("col20$", names(mydf))], as.symbol)
    

    以下是使用内置 mtcars 数据框的 dplyr 代码的工作示例:

    dots = lapply(c("am","vs","cyl","carb"), as.symbol)
    
    mtcars %>%
      group_by_(.dots=dots) %>%
      summarise(all_mpg = paste(mpg, collapse=", "))
    

    am vs cyl carb all_mpg
    1 0 0 8 2 18.7,15.5,15.2,19.2
    2 0 0 8 3 16.4,17.3,15.2
    3 0 0 8 4 14.3,10.4,10.4,14.7,13.3
    4 0 1 4 1 21.5
    5 0 1 4 2 24.4,22.8
    6 0 1 6 1 21.4,18.1
    7 0 1 6 4 19.2,17.8
    8 1 0 4 2 26
    9 1 0 6 4 21,21
    10 1 0 6 6 19.7
    11 1 0 8 4 15.8
    12 1 0 8 8 15
    13 1 1 4 1 22.8,32.4,33.9,27.3
    14 1 1 4 2 30.4,30.4,21.4

相关问题