微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用字符串向量输入在 dplyr 中按多列分组

如何解决使用字符串向量输入在 dplyr 中按多列分组

由于发布了这个问题,dplyr 添加group_by文档here)的范围版本。这使您可以使用与 一起使用的相同功能select,如下所示:

data = data.frame(
    asihckhdoydkhxiydfgfTgdsx = sample(LETTERS[1:3], 100, replace=TRUE),
    a30mvxigxkghc5cdsvxvyv0ja = sample(LETTERS[1:3], 100, replace=TRUE),
    value = rnorm(100)
)

# get the columns we want to average within
columns = names(data)[-3]

library(dplyr)
df1 <- data %>%
  group_by_at(vars(one_of(columns))) %>%
  summarize(Value = mean(value))

#compare plyr for reference
df2 <- plyr::ddply(data, columns, plyr::summarize, value=mean(value))
table(df1 == df2, useNA = 'ifany')
## TRUE 
##  27

您的示例问题的输出与预期的一样(参见上面的 plyr 和下面的输出比较):

# A tibble: 9 x 3
# Groups:   asihckhdoydkhxiydfgfTgdsx [?]
  asihckhdoydkhxiydfgfTgdsx a30mvxigxkghc5cdsvxvyv0ja       Value
                     <fctr>                    <fctr>       <dbl>
1                         A                         A  0.04095002
2                         A                         B  0.24943935
3                         A                         C -0.25783892
4                         B                         A  0.15161805
5                         B                         B  0.27189974
6                         B                         C  0.20858897
7                         C                         A  0.19502221
8                         C                         B  0.56837548
9                         C                         C -0.22682998

请注意,由于一次dplyr::summarize只剥离一层分组,因此您仍然会在生成的 tibble 中进行一些分组(有时可能会在以后通过惊喜来吸引人们)。如果您想绝对避免意外的分组行为,您可以%>% ungroup在汇总后随时添加到您的管道中。

解决方法

我试图将我对 plyr 的理解转移到 dplyr 中,但我不知道如何按多列进行分组。

# make data with weird column names that can't be hard coded
data = data.frame(
  asihckhdoydkhxiydfgfTgdsx = sample(LETTERS[1:3],100,replace=TRUE),a30mvxigxkghc5cdsvxvyv0ja = sample(LETTERS[1:3],value = rnorm(100)
)

# get the columns we want to average within
columns = names(data)[-3]

# plyr - works
ddply(data,columns,summarize,value=mean(value))

# dplyr - raises error
data %.%
  group_by(columns) %.%
  summarise(Value = mean(value))
#> Error in eval(expr,envir,enclos) : index out of bounds

将 plyr 示例转换为 dplyr-esque 语法时,我缺少什么?

2017 年编辑 :Dplyr 已更新,因此可以使用更简单的解决方案。查看当前选择的答案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。