У меня есть одна метри 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. - Я также подчистил воспроизводимый пример до более простого.