我有一堆不同天气变量(湿度、温度等(的天气数据集,还有一个带有气象站 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]
将其从摘要中删除。