使用 dplyr 计算分组平均值和逻辑值之间的差异

Kei*_*itt 3 r dplyr summarize

有谁知道如何使用 dplyr 来计算 和 的平均值之间的差异,some_var == TRUE并按some_var == FALSE第三个变量分组?

例如,给出以下示例数据框:

library('dplyr')

dat <- iris %>% 
     mutate(wide=Sepal.Width > 3) %>% 
     group_by(Species, wide) %>% 
     summarize(mean_width=mean(Sepal.Width))

dat

# A tibble: 6 x 3
# Groups:   Species [?]
     Species  wide mean_width
      <fctr> <lgl>      <dbl>
1     setosa FALSE   2.900000
2     setosa  TRUE   3.528571
3 versicolor FALSE   2.688095
4 versicolor  TRUE   3.200000
5  virginica FALSE   2.800000
6  virginica  TRUE   3.311765
Run Code Online (Sandbox Code Playgroud)

有谁知道一种方法来派生一个新的数据框,其差异为wide == TRUEwide == FALSE,按物种?

这可以使用几个语句来完成:

false_vals <- dat %>% filter(wide==FALSE)
true_vals <- dat %>% filter(wide==TRUE)

diff <- data.frame(Species=unique(dat$Species), diff=true_vals$mean_width - false_vals$mean_width)

> diff
     Species      diff
1     setosa 0.6285714
2 versicolor 0.5119048
3  virginica 0.5117647
Run Code Online (Sandbox Code Playgroud)

然而,这似乎应该可以直接使用 dplyr 来实现。

有任何想法吗?

mto*_*oto 5

spread()从 包中使用tidyr

library(tidyr)

iris %>% mutate(wide=Sepal.Width > 3) %>% 
        group_by(Species, wide) %>% 
        summarize(mean_width=mean(Sepal.Width)) %>%
        spread(wide, mean_width) %>%
        summarise(diff = `TRUE` - `FALSE`)
#     Species      diff
#1     setosa 0.6285714
#2 versicolor 0.5119048
#3  virginica 0.5117647
Run Code Online (Sandbox Code Playgroud)