我试图将我对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], 100, replace=TRUE),
  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式语法,我遗漏了什么?

Edit 2017:Dplyr已经更新,因此有了更简单的解决方案.查看当前 Select 的答案.

推荐答案

自从这个问题发布后,dplyr增加了group_by(documentation 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添加到你的管道中.

R相关问答推荐

收件箱摘要表布局在第一列上显示子类别

如何使用R以NASAGIBS.ViirsEarthAtNight2012风格绘制自定义 map

feature_weights参数没有影响Xgboost

将虚线添加到每个站点的传奇中平均

IQR()和stats之间四分位距计算的差异::分位数()在R和' ggpubr '

在R中创建一个包含转换和转换之间的时间的列

在使用ggroove后,将图例合并在gplot中

使用gcuminc,如何使用逗号格式化风险表?

用预测NLS处理R中生物学假设之上的误差传播

在数学中正确显示摄氏度、开氏度或华氏度

如何将旋转后的NetCDF转换回正常的纬度/经度网格,并使用R?

将数据集中的值增加到当前包含的最大值

在GGPLATE中将突出的点放在前面

如何调整曲线图中的y轴标签?

R函数,用于生成伪随机二进制序列,其中同一数字在一行中不出现超过两次

仅在R中的数据集开始和结束时删除所有 Select 列的具有NA的行

如何在R中使用hmm TMB提前一步预测观察到的状态?

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?

填充图例什么时候会有点?

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)