R - 对变量的所有离散值使用 DPLYR 滤波器

  • 本文关键字:滤波器 DPLYR 变量 r dplyr
  • 更新时间 :
  • 英文 :


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

我想按每个站点进行过滤,并在过滤后对天气变量运行摘要,并合并回 1 个数据帧或 tibble。

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

我不应该为每个离散值键入它,而不是创建一个函数,或者是否有一些我不知道的很酷的整洁技巧来完成此操作?

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

你去吧:

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]将其从摘要中删除。

最新更新