Знаменатель при использовании двух переменных в group_by в R tidyverse - PullRequest
0 голосов
/ 05 июня 2019

Я хочу рассчитать среднее и стандартное отклонение контактов для двадцати видов больничных услуг в двух группах испытаний. Я сделал это до сих пор с помощью group_by(arm, service). Это дает среднее число людей, которые используют эту услугу в этой руке. Вместо этого мой босс хочет получить среднее значение по каждой службе, разделенное на всех в этой руке.

Таким образом, если имеется 100 кардиологических контактов, по 30 пациентов в каждой руке, но 10 посещают кардиологическое назначение, расчет должен быть 100/30, а не 100/10. Единственный способ, которым я могу думать об этом, - это разделить руки на отдельные наборы данных, и тогда мне нужно будет только группировать по сервисам, что решает проблему.

Пример того, как это выглядит:

rep_prob <- tibble(id = 1:6, arm = c(1,1,1,0,0,0), service = c(1,1,2,1,2,2), contacts = c(21,3,14, 2,5,10)) %>% 
  group_by(arm, service) %>% 
  summarise(mean = mean(contacts), sd = sd(contacts))

Что дает результаты, которые выглядят так:

arm  service  mean   sd
0     1        2.0   NaN
0     2        7.5   3.535534
1     1        12.0  12.727922
1     2        14.0  NaN

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

Это, очевидно, очень просто в Stata, и я единственный человек в моем отделе, который использует R. Для всех других моих таблиц результатов я делю свою таблицу только на одну переменную и, таким образом, использую group_by (arm), а затем суммирую работы.

1 Ответ

0 голосов
/ 07 июня 2019

Возможно, то, что вы ищете, выглядит следующим образом:

library(tidyverse)

dat <- tibble(
    id = 1:6, 
    arm = c(1,1,1,0,0,0), 
    service = c(1,1,2,1,2,2), 
    contacts = c(21,3,14, 2,5,10)
) 

rep_prob <- dat %>% 
    group_by(arm, service) %>% 
    mutate(sum = sum(contacts)) %>%
    group_by(arm) %>%
    mutate(mean = sum / sum(contacts)) %>%
    ungroup()

, который вычисляет групповые суммы на arm и service, разделенные на размеры выборки группы для категории arm. Определение sd будет зависеть от того, каким образом центрируются наблюдения (то есть, как определяется среднее значение выборки для каждой группы).

Примечание: разделение dat на отдельные наборы данных по переменной arm и группирование по service дало бы те же результаты, что и группировка по arm и service напрямую, что, вероятно, не то, что вы имеете в ум.


Редактировать: если вы предпочитаете использовать summarise, вы также можете переставить выражения как:

rep_prob <- dat %>% 
   group_by(arm) %>% 
   mutate(contacts_scaled = contacts / sum(contacts)) %>%
   group_by(service, add = TRUE) %>%
   summarise(mean = sum(contacts_scaled)) %>%
   ungroup()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...