Добавление процентов, рассчитанных group_by, ко всем строкам в этой группе? - PullRequest
1 голос
/ 25 июня 2019

Пример кода

mtcars %>% group_by(am, gear) %>% summarise (n = n()) %>% mutate(percent_pos = n / sum(n))

В результате:

# A tibble: 4 x 4
# Groups:   am [2]
     am  gear     n percent_pos
  <dbl> <dbl> <int>       <dbl>
1     0     3    15       0.789
2     0     4     4       0.211
3     1     4     8       0.615
4     1     5     5       0.385

Я хотел бы добавить значение 0,789 столбца percent_pos ко всем автомобилям, которые являются am = 0, через новый столбец в кадре данных mtcars с меткой percentage_positive

Хотя в этом примере я могу строго ссылаться на am = 0 или am = 1 (используя оператор if и т. Д.), В моем реальном наборе данных у меня будут сотни дат, к которым это будет применяться, что затруднит ручное кодирование каждая ссылка.

Я надеялся использовать функцию group_by в dplyr, чтобы применить значение ко всем строкам, сгруппированным по "am", но у меня возникли проблемы с функцией mutate.

Ответы [ 3 ]

1 голос
/ 25 июня 2019

Я не уверен, что полностью понимаю, что вы имеете в виду под следующим:

Я хотел бы добавить значение 0,789 столбцаcent_pos ко всем автомобилям с am = 0 через новый столбец в фрейме данных mtcars с меткой процент_позитивом

Проблема в том, что вы вычислили несколько различных percent_pos значений для am == 0 (фактически для каждого значения am). Поэтому кажется несколько произвольным подчеркнуть только первое значение. Может быть, это именно то, что вы ищете, но это не ясно из предоставленной информации. Если, с другой стороны, ваш вопрос на самом деле:

Как мне сопоставить вычисленное значение percent_pos, соответствующее каждой уникальной комбинации am и gear, с исходными данными?

Тогда следующая простая операция left_join приведет вас туда:

mtcars %>%
  left_join(
    mtcars %>%
      group_by(am, gear) %>%
      summarise (n = n()) %>%
      mutate(percent_pos = n / sum(n)),
    by = c('am', 'gear')
  )

Первые / последние 4 строки результирующего тибля выглядят следующим образом:

    mpg cyl disp  hp drat    wt  qsec vs am gear carb  n percent_pos
1  21.0   6  160 110 3.90 2.620 16.46  0  1    4    4  8   0.6153846
2  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4  8   0.6153846
3  22.8   4  108  93 3.85 2.320 18.61  1  1    4    1  8   0.6153846
4  21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 15   0.7894737

29 15.8   8  351 264 4.22 3.170 14.50  0  1    5    4  5   0.3846154
30 19.7   6  145 175 3.62 2.770 15.50  0  1    5    6  5   0.3846154
31 15.0   8  301 335 3.54 3.570 14.60  0  1    5    8  5   0.3846154
31 21.4   4  121 109 4.11 2.780 18.60  1  1    4    2  8   0.6153846

Этот подход должен иметь возможность масштабирования до произвольного числа группирующих переменных.

1 голос
/ 25 июня 2019

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

max.per <- mtcars %>%
   group_by(am, gear) %>%
   summarise (n = n()) %>%
   mutate(percent_pos = n / sum(n)) %>%
   mutate(percent_pos = max(percent_pos)) %>%
   distinct(am,gear, percent_pos)

# A tibble: 4 x 3
# Groups:   am [2]
     am  gear percent_pos
  <dbl> <dbl>       <dbl>
1     0     3       0.789
2     0     4       0.789
3     1     4       0.615
4     1     5       0.615


mtc <- merge(mtcars, max.per, by = c("am","gear"))
0 голосов
/ 25 июня 2019

Я не уверен, что понимаю ваш вопрос, но, возможно, mutate_if может быть решением.состояние утра == 0 Питер

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