我有一个包含20列的数据框.最后一列是文本字段.我想按前19列分组,并连接最后一个文本列的值.我一直试图通过使用dplyr实现这一目的,如下所示:
mydf %>%
group_by(col1, col2, col3, ... col19) %>%
summarise(alltasks = c(col20))
Run Code Online (Sandbox Code Playgroud)
但这不起作用并返回此错误消息:
eval中的错误(替换(expr),envir,enclos):期望单个值
我究竟做错了什么?
正如@thelatemail所指出的,你需要返回一个值,而不是所有值的向量.这是一个如何做到这一点的例子:
dots = lapply(paste0("col", 1:19), as.symbol)
mydf %>%
group_by_(.dots=dots) %>%
summarise(alltasks = paste(col20, collapse=", "))
Run Code Online (Sandbox Code Playgroud)
对summarise行的更改是将所有值粘贴col20到单个字符串中的方式.我使用了逗号空间分隔符,但您当然可以将其更改为您喜欢的任何内容.该dots业务仅仅是一个对所有分组变量组合,而无需输入了每一个更简单的方法.
如果名称mydf不是那么规则,你可以使用一个简单的paste函数来生成它们,其他选项将是,例如:
dots = lapply(names(mydf)[1:19], as.symbol)
Run Code Online (Sandbox Code Playgroud)
要么
dots = lapply(names(mydf)[-grep("col20$", names(mydf))], as.symbol)
Run Code Online (Sandbox Code Playgroud)
以下是dplyr使用内置mtcars数据框的代码的工作示例:
dots = lapply(c("am","vs","cyl","carb"), as.symbol)
mtcars %>%
group_by_(.dots=dots) %>%
summarise(all_mpg = paste(mpg, collapse=", "))
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)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
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |