我试图将我对 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-esque 语法时,我缺少什么?
2017 年编辑 :Dplyr 已更新,因此可以使用更简单的解决方案。查看当前选择的答案。
由于发布了这个问题,dplyr 添加了group_by(文档here)的范围版本。这使您可以使用与 一起使用的相同功能select,如下所示:
group_by
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在汇总后随时添加到您的管道中。
dplyr::summarize
%>% ungroup