создание новой функции для серии повторяющихся задач: для циклов? новая функция? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть одна метри c для расчета за 13 периодов времени для 17 категорий. Затем мне нужно объединить все вычисления в единую таблицу, чтобы я мог подвести итоги. Я знаю, что вы можете автоматизировать этот , чтобы сократить время, количество строк и повысить точность, но я не уверен, как к этому подойти. Обращение к SO за руководством!

Воспроизводимый пример

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

#example data
date <- c("2020-01-01", 
          "2020-01-01", 
          "2020-01-01",
          "2020-01-02", 
          "2020-01-02", 
          "2020-01-03", 
          "2020-01-03", 
          "2020-01-03", 
          "2020-01-04", 
          "2020-01-04", 
          "2020-01-04", 
          "2020-01-04", 
          "2020-01-05", 
          "2020-01-05", 
          "2020-01-06")

category <- c("A", "B", "B", "C", "C", 
              "A", "A", "A", "B", "B", 
              "C", "D","A", "B", "C")

person <- c("Alice", "Alice", "Bob", "Bob", "Charles", 
            "Bob", "Bob", "Bob", "Bob", "Bob", 
            "Bob", "Bob", "Charles", "Charles", "Alice")

example <- tibble(date, 
                  category, 
                  person)

# subsetting by 3 time periods, each of with different lengths
period1 <- example_cat %>%
  filter(date <= as.Date("2020-01-02"))

period2 <- example_cat %>% 
  filter(date > as.Date("2020-01-02") &
           date <= as.Date("2020-01-04"))

period3 <- example_cat %>% 
  filter(date > as.Date("2020-01-04") &
           date <= as.Date("2020-01-06"))

Что я хотел бы вычислить для каждой категории за период времени:

# e.g. calculation for category A, period 1
cats <- unique(example$category)

cat1_pd1_X <- period1 %>% 
  dplyr::filter(category == cats[1]) %>% 
  subset(select = person) %>% 
  distinct()

cat1_pd1_Y <- period1 %>% 
  dplyr::filter(category != cats[1]) %>% 
  subset(select = person) %>% 
  distinct()

cat1_pd1_x1 <- nrow(dplyr::intersect(cat1_pd1_X, cat1_pd1_Y))
cat1_pd1_y1 <- nrow(dplyr::setdiff(cat1_pd1_X, cat1_pd1_Y))
cat1_pd1_value <- (cat1_pd1_x1 - cat1_pd1_y1)/(cat1_pd1_x1 + cat1_pd1_y1)

Желаемое решение

Есть ли способ повторить фрагмент кода выше с помощью cat [1: 4] и точки [1: 4]? Я так и не научился создавать циклы, и это действительно сэкономило бы время и здравомыслие.


Редактирование вопроса : - Я сузил объем желаемой функции или l oop. - Я также подчистил воспроизводимый пример до более простого.

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