использовать фильтр dplyr для всех дискретных значений переменной - PullRequest
0 голосов
/ 07 июня 2018

У меня есть набор данных о погоде с кучей различных переменных погоды (влажность, температура и т. Д.), А также столбец с идентификатором метеостанции.

Я хочу выполнить фильтрацию по каждой станции и запустить сводку поПогодные переменные после фильтрации и объединения обратно в 1 кадр данных или таблицу.

Я сделал репрезент с mtcars, который использует цилиндр в качестве моей дискретной переменной вместо моей метеостанции.

Вместо того, чтобы вводить это для каждого дискретного значения, я должен сделать функцию, или есть какой-то крутой трюк с обратным ходом, которого я не знаю, чтобы выполнить это?

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 голосов
/ 07 июня 2018

Итак:

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.И я использовал .[-1] в вызове do, чтобы удалить его из сводки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...