除了一列之外,如何分组?

时间:2016-08-27 12:35:59

标签: r dplyr

如何告诉// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.+' } } allprojects { repositories { jcenter() } } 除了给定的列以外的所有列对数据进行分组?

使用group_by,它将是aggregate

我尝试了aggregate(x ~ ., ...),但是这些组是负x的(即与x分组相同)。

3 个答案:

答案 0 :(得分:24)

您可以使用标准评估(group_by_代替group_by)来执行此操作:

# Fake data
set.seed(492)
dat = data.frame(value=rnorm(1000), g1=sample(LETTERS,1000,replace=TRUE),
                 g2=sample(letters,1000,replace=TRUE), g3=sample(1:10, replace=TRUE),
                 other=sample(c("red","green","black"),1000,replace=TRUE))

dat %>% group_by_(.dots=names(dat)[-grep("value", names(dat))]) %>%
  summarise(meanValue=mean(value))
       g1     g2    g3  other   meanValue
   <fctr> <fctr> <int> <fctr>       <dbl>
1       A      a     2  green  0.89281475
2       A      b     2    red -0.03558775
3       A      b     5  black -1.79184218
4       A      c    10  black  0.17518610
5       A      e     5  black  0.25830392
...

有关dplyr中标准与非标准评估的更多信息,请参阅this vignette

dplyr 0.7.0

的更新

要解决@ÖmerAn的评论:看起来group_by_at是进入dplyr 0.7.0的方式(如果我错了,请有人纠正我)。例如:

dat %>% 
  group_by_at(names(dat)[-grep("value", names(dat))]) %>%
  summarise(meanValue=mean(value))
# Groups:   g1, g2, g3 [?]
       g1     g2    g3  other   meanValue
   <fctr> <fctr> <int> <fctr>       <dbl>
 1      A      a     2  green  0.89281475
 2      A      b     2    red -0.03558775
 3      A      b     5  black -1.79184218
 4      A      c    10  black  0.17518610
 5      A      e     5  black  0.25830392
 6      A      e     5    red -0.81879788
 7      A      e     7  green  0.30836054
 8      A      f     2  green  0.05537047
 9      A      g     1  black  1.00156405
10      A      g    10  black  1.26884303
# ... with 949 more rows

让我们确认两种方法都给出相同的输出(dplyr 0.7.0):

new = dat %>% 
  group_by_at(names(dat)[-grep("value", names(dat))]) %>%
  summarise(meanValue=mean(value))

old = dat %>% 
  group_by_(.dots=names(dat)[-grep("value", names(dat))]) %>%
  summarise(meanValue=mean(value))

identical(old, new)
# [1] TRUE

答案 1 :(得分:20)

在@ eipi10的dplyr 0.7.0编辑的基础上,group_by_at似乎是这项工作的正确功能。但是,如果您只是想省略列&#34; x&#34;,那么您可以使用:

new2.0 <- dat %>%
  group_by_at(vars(-x)) %>%
  summarize(mean_value = mean(value))

使用@ eipi10的示例数据:

# Fake data
set.seed(492)
dat <- data.frame(value = rnorm(1000),
             g1 = sample(LETTERS, 1000, replace = TRUE),
             g2 = sample(letters, 1000, replace = TRUE),
             g3 = sample(1:10, replace = TRUE),
             other = sample(c("red", "green", "black"), 1000, replace = TRUE))

new <- dat %>% 
  group_by_at(names(dat)[-grep("value", names(dat))]) %>%
  summarise(meanValue = mean(value))


new2.0 <- dat %>% 
  group_by_at(vars(-value)) %>% 
  summarize(meanValue = mean(value))

identical(new, new2.0)
# [1] TRUE

答案 2 :(得分:9)

关于这个问题的一个小更新,因为我自己偶然发现了这个问题,并找到了当前版本dplyr(0.7.4)的优雅解决方案: 在group_by_at()内,您可以使用select()以与vars()函数相同的方式提供列的名称。这使我们能够通过编写:

来按除一列(本例中为hp)之外的所有内容进行分组
library(dplyr)
df <- as_tibble(mtcars, rownames = "car")
df %>% group_by_at(vars(-hp))