Как автоматизировать с помощью R - PullRequest
0 голосов
/ 06 августа 2020

Извините, что прошу о помощи без каких-либо данных, потому что мне не разрешено делиться данными, над которыми я работаю, а структура воспроизводится с трудом. Вот как выглядит моя база данных:

IDofStay   HospitalCode     City
1111111      Hospital A   City A
2222222      Hospital A   City B
1343276      Hospital B   City B
3293105      Hospital C   City A
1332222      Hospital C   City C

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

Задача только для одной больницы («Госпиталь А»)

ПЕРВЫЙ ШАГ:

Определение больницы Рынок (город составляет 40% его рынка)
HospitalCode <- "Hospital A"

AreaOfHospitA<-data%>%filter(HospitalCode ==HospitalCode )%>%
  group_by(City)%>%count%>%arrange(desc(n))%>%ungroup()%>%
  mutate(pct = n/sum(n)*100,
         cum_pct = cumsum(pct))%>%filter(cum_pct<=40)

ВТОРОЙ ШАГ

ФИЛЬТРАЦИЯ ОСНОВНЫХ ДАННЫХ ПО ГОРОДАМ, ФОРМИРУЮЩИМ РЫНОК БОЛЬНИЦЫ

Dataframe<-data%>%filter(City%in%AreaOfHospitA$City)

ТРЕТИЙ ШАГ

РАСЧЕТ ПРОЦЕНТА КАЖДОЙ БОЛЬНИЦЫ

PctHop<-Dataframe%>%group_by(HospitalCode)%>%count()%>%
arrange(desc(n))%>%ungroup()%>%
  mutate(pct = n/sum(n)*100, cum_pct = cumsum(pct))

РАСЧЕТ КОЛИЧЕСТВА КОНКУРЕНЦИОННЫХ БОЛЬНИЦ С ОТСЕЧЕНИЕМ 1%

PctHopCut_off<-PctHop%>%filter(pct>=1)
nbOfCompet<-nrow(PctHopCut_off)

РАСЧЕТ ИНДЕКСА КОНКУРСА

CompInd<-sum(PctHop$pct^2)/10000

Finaldataframe=data.frame(HospitalCode =HospitalCode ,nbOfCompet=nbOfCompet,CompInd=CompInd)

Наконец, у меня есть такой фрейм данных только для одной больницы (Больница A)

Finaldataframe
    HospitalCode    nbOfCompet      CompInd
1     Hospital A            10     0.2603833

Я должен вычислить эту строку кодов для тысяч больниц в моем основном фрейме данных, а затем объединить их, чтобы иметь такую ​​таблицу ниже:

    HospitalCode    nbOfCompet      CompInd
1     Hospital A            10     0.2603833
      Hospital B             8     0.3265626
      Hospital C            13     0.1265612 

1 Ответ

1 голос
/ 06 августа 2020

Как уже указывалось в комментариях, вы можете сначала объединить свои шаги в функцию, а затем применить эту функцию для нескольких / всех больниц.

Без изменения кода (таким образом, предполагая, что там все правильно), это, например, работает следующим образом:

# Combine steps in function 
calc_hospitals <- function(hospital){
  HospitalCode <- hospital
  
  AreaOfHospitA <- data %>%
    filter(HospitalCode == HospitalCode) %>%
    group_by(City) %>% 
    count() %>%
    arrange(desc(n)) %>%
    ungroup() %>%
    mutate(pct = n/sum(n)*100,
           cum_pct = cumsum(pct)) %>%
    filter(cum_pct<=40)
  
  Dataframe <- data %>%
    filter(City %in% AreaOfHospitA$City)
  
  PctHop <- Dataframe %>% 
    group_by(HospitalCode) %>%
    count() %>%
    arrange(desc(n)) %>%
    ungroup() %>%
    mutate(pct = n/sum(n)*100, cum_pct = cumsum(pct))
  
  PctHopCut_off <- PctHop %>% filter(pct>=1)
  nbOfCompet <- nrow(PctHopCut_off)
  
  CompInd <- sum(PctHop$pct^2)/10000
  
  tibble(HospitalCode = HospitalCode,
         nbOfCompet = nbOfCompet,
         CompInd = CompInd)
}

# Apply this function to hospital A and hospital B
c("Hospital A", "Hospital B") %>%
  purrr::map_df(calc_hospitals)

# Apply function to all hospitals in dataframe
data$HospitalCode %>% 
  unique() %>%
  purrr::map_df(calc_hospitals)
...