我的天气数据集包含许多不同的天气变量(湿度,温度等)以及带有气象站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
答案 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
将其从摘要中删除。