【问题标题】:How to collapse dataframe by grouping and concatenating on one column如何通过在一列上进行分组和连接来折叠数据框
【发布时间】:2017-03-23 20:32:18
【问题描述】:

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

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

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

eval(substitute(expr), envir, enclos) 中的错误:需要一个 价值

我做错了什么?

【问题讨论】:

  • c 将只返回每个组中的所有值,而不是像summarise 需要的单个汇总值。在不知道你到底想要什么的情况下,也许summarise(alltasks=toString(col20))
  • 试试pastetoString

标签: r dplyr


【解决方案1】:

正如@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

【讨论】:

  • 非常感谢。这非常有帮助,正是我想要的,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多