1

当您使用group_by多个变量时,dplyr有助于找到这些组的交集。

例如,

mtcars %>% 
  group_by(cyl, am) %>%
  summarise(mean(disp))

产量

Source: local data frame [6 x 3]
Groups: cyl [?]

    cyl    am `mean(disp)`
  <dbl> <dbl>        <dbl>
1     4     0     135.8667
2     4     1      93.6125
3     6     0     204.5500
4     6     1     155.0000
5     8     0     357.6167
6     8     1     326.0000

我的问题是,有没有办法提供多个变量,但要稍微总结一下?如果您手动执行此操作,我希望输出与您得到的输出一样,逐个变量。

df_1 <- 
  mtcars %>% 
  group_by(cyl) %>%
  summarise(est = mean(disp)) %>%
  transmute(group = paste0("cyl_", cyl), est)

df_2 <- 
  mtcars %>% 
  group_by(am) %>%
  summarise(est = mean(disp)) %>%
  transmute(group = paste0("am_", am), est)

bind_rows(df_1, df_2)

上面的代码产生

# A tibble: 5 × 2
  group      est
  <chr>    <dbl>
1 cyl_4 105.1364
2 cyl_6 183.3143
3 cyl_8 353.1000
4  am_0 290.3789
5  am_1 143.5308

理想情况下,语法类似于

mtcars %>%
group_by(cyl, am, intersection = FALSE) %>%
summarise(est = mean(disp))

中是否存在类似的东西tidyverse

(ps,我知道上group表中的变量并不整洁,因为它包含两个变量合二为一,但我保证为了我的目的它是整洁的,好吗?:))

4

3 回答 3

4

我猜你要找的是tidyr包裹...

gather首先复制数据集,以便每个因素有 n 行,将按这些因素进行分组;mutate然后创建分组变量。

library(dplyr)
library(tidyr)

mtcars %>%
  gather(col, value, cyl, am) %>% 
  mutate(group = paste(col, value, sep = "_")) %>%
  group_by(group) %>% 
  summarise(est = mean(disp))
于 2016-11-28T19:01:40.790 回答
1

另一种purrr选择:

library(tidyverse)

map(c('cyl', 'am'), 
    ~ mtcars %>% 
      group_by_(.x) %>%
      summarise(est = mean(disp)) %>%
      transmute_(group = lazyeval::interp(~paste0(.x, '_', y), y = as.name(.x)),
                 ~est)) %>% 
  bind_rows()
# A tibble: 5 × 2
  group      est
  <chr>    <dbl>
1 cyl_4 105.1364
2 cyl_6 183.3143
3 cyl_8 353.1000
4  am_0 290.3789
5  am_1 143.5308
于 2016-11-28T22:42:40.890 回答
0

plyr包更容易。

library(plyr)
mtcars %>% 
  ddply(c("cyl", "am"), .fun = function(x) {
    mean(x$disp)
  })
于 2022-03-03T13:26:15.740 回答