क्या किसी को तीसरे चर द्वारा समूहीकृत some_var == TRUE और some_var == FALSE के औसत के बीच अंतर की गणना करने के लिए dplyr का उपयोग करने का तरीका पता है?

उदाहरण के लिए, निम्न उदाहरण डेटाफ़्रेम दिया गया है:

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

क्या किसी को प्रजातियों द्वारा wide == TRUE और wide == 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

हालाँकि, ऐसा कुछ ऐसा लगता है जिसे सीधे dplyr से प्राप्त किया जाना चाहिए।

कोई विचार?

3
Keith Hughitt 9 पद 2017, 18:38

2 जवाब

सबसे बढ़िया उत्तर

tidyr पैकेज से spread() का उपयोग करना:

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
4
mtoto 9 पद 2017, 18:45

Tidyr पैकेज के नए संस्करण (>1.0.0) के लिए, अब स्प्रेड के बजाय pivot_wider कमांड का उपयोग करना बेहतर है। इसके अधिक सहज, और प्रसार आदेश को भविष्य में पदावनत किया जा सकता है।

library(tidyr)

    iris %>% mutate(wide=Sepal.Width > 3) %>% 
            group_by(Species, wide) %>% 
            summarize(mean_width=mean(Sepal.Width)) %>%
            pivot_wider(names_from = wide, values_from = mean_width) %>%
            summarise(diff = `TRUE` - `FALSE`)

    #     Species      diff
    #1     setosa 0.6285714
    #2 versicolor 0.5119048
    #3  virginica 0.5117647
1
Facu 23 अप्रैल 2020, 13:43