【问题标题】:use dplyr filter for all discrete values of variable对变量的所有离散值使用 dplyr 过滤器
【发布时间】:2018-11-17 12:52:04
【问题描述】:

我有包含一堆不同天气变量(湿度、温度等)的天气数据集,还有一个带有气象站 ID 的列。

我想按每个站点进行过滤,并在过滤后对天气变量进行汇总,然后组合回 1 个数据框或 tibble。

我用 mtcars 做了一个 reprex,它使用圆柱体作为我的离散变量而不是我的气象站。

我应该创建一个函数,而不是必须为每个离散值输入这个,还是有一些我不知道的很酷的 tidyverse 技巧来完成这个?

library(tidyverse, warn.conflicts = FALSE, quietly = TRUE)
library(broom)
mtcars_new <- rownames_to_column(mtcars, "car")
cyl_4 <- filter(mtcars_new, cyl == 4) %>% select(4:8) %>% map(~tidy(summary(.x))) %>% do.call(rbind,.) %>% rownames_to_column(var = "var")
cyl_6 <- filter(mtcars_new, cyl == 6) %>% select(4:8) %>% map(~tidy(summary(.x))) %>% do.call(rbind,.) %>% rownames_to_column(var = "var")
cyl_8 <- filter(mtcars_new, cyl == 8) %>% select(4:8) %>% map(~tidy(summary(.x))) %>% do.call(rbind,.) %>% rownames_to_column(var = "var")
bind_rows(list("4" = cyl_4, "6" = cyl_6, "8" = cyl_8), .id = "cyl")
#>    cyl  var minimum       q1  median       mean        q3 maximum
#> 1    4 disp  71.100  78.8500 108.000 105.136364 120.65000 146.700
#> 2    4   hp  52.000  65.5000  91.000  82.636364  96.00000 113.000
#> 3    4 drat   3.690   3.8100   4.080   4.070909   4.16500   4.930
#> 4    4   wt   1.513   1.8850   2.200   2.285727   2.62250   3.190
#> 5    4 qsec  16.700  18.5600  18.900  19.137273  19.95000  22.900
#> 6    6 disp 145.000 160.0000 167.600 183.314286 196.30000 258.000
#> 7    6   hp 105.000 110.0000 110.000 122.285714 123.00000 175.000
#> 8    6 drat   2.760   3.3500   3.900   3.585714   3.91000   3.920
#> 9    6   wt   2.620   2.8225   3.215   3.117143   3.44000   3.460
#> 10   6 qsec  15.500  16.7400  18.300  17.977143  19.17000  20.220
#> 11   8 disp 275.800 301.7500 350.500 353.100000 390.00000 472.000
#> 12   8   hp 150.000 176.2500 192.500 209.214286 241.25000 335.000
#> 13   8 drat   2.760   3.0700   3.115   3.229286   3.22500   4.220
#> 14   8   wt   3.170   3.5325   3.755   3.999214   4.01375   5.424
#> 15   8 qsec  14.500  16.0975  17.175  16.772143  17.55500  18.000

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你去吧:

    library(tidyverse)
    mtcars %>%
      rownames_to_column("car") %>%
      select(3:8) %>%
      group_by(cyl) %>%
      do(map_dfr(.[-1],~tidy(summary(.x)),.id="var")) %>%
      ungroup
    
    # # A tibble: 15 x 8
    #      cyl   var minimum      q1  median    mean      q3 maximum
    #    <dbl> <chr>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
    #  1     4  disp  71.100  78.850 108.000 105.100 120.600 146.700
    #  2     4    hp  52.000  65.500  91.000  82.640  96.000 113.000
    #  3     4  drat   3.690   3.810   4.080   4.071   4.165   4.930
    #  4     4    wt   1.513   1.885   2.200   2.286   2.622   3.190
    #  5     4  qsec  16.700  18.560  18.900  19.140  19.950  22.900
    #  6     6  disp 145.000 160.000 167.600 183.300 196.300 258.000
    #  7     6    hp 105.000 110.000 110.000 122.300 123.000 175.000
    #  8     6  drat   2.760   3.350   3.900   3.586   3.910   3.920
    #  9     6    wt   2.620   2.822   3.215   3.117   3.440   3.460
    # 10     6  qsec  15.500  16.740  18.300  17.980  19.170  20.220
    # 11     8  disp 275.800 301.800 350.500 353.100 390.000 472.000
    # 12     8    hp 150.000 176.200 192.500 209.200 241.200 335.000
    # 13     8  drat   2.760   3.070   3.115   3.229   3.225   4.220
    # 14     8    wt   3.170   3.532   3.755   3.999   4.014   5.424
    # 15     8  qsec  14.500  16.100  17.180  16.770  17.560  18.000
    

    第一个简化是使用map_dfr.id 参数,而不是map + do.call / rbind + rownames_to_column

    第二个是group_by并使用do,它为每个组返回一个data.frame并将它们绑定到您想要的结果中。

    请注意,我将您的 4:8 更改为 3:8 以包含 cyl。我在do 调用中使用.[-1] 将其从摘要中删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多