对所有离散的变量值使用dplyr过滤器

时间:2018-06-07 14:40:44

标签: r dplyr

我的天气数据集包含许多不同的天气变量(湿度,温度等)以及带有气象站ID的列。

我希望按照每个电台进行过滤,并在过滤后对天气变量进行汇总,并将其组合回1个数据帧或tibble。

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

我不应该为每个离散值输入这个,而应该创建一个函数,还是有一些很酷的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

1 个答案:

答案 0 :(得分:2)

你去了:

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。< / p>

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

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