Условно игнорировать значение в group_by в dplyr - PullRequest
0 голосов
/ 07 июня 2018

Пожалуйста, примите во внимание следующее.

Фон

В data.frame у меня есть идентификаторы пациента (id), деньв котором пациенты поступают в больницу (day), код диагностической активности, полученной ими в тот день (code), цена этой активности (price) и частота этой активности (freq).

Действия с code b и c регистрируются одновременно, но означают более или менее одно и то же и не должны учитываться дважды.


Проблема

Что я хочу, это: если code "b" и "c" зарегистрированы для одного и того же дня , code "b" следует игнорировать.

Пример data.frame выглядит следующим образом:

x <- data.frame(id = c(rep("a", 4), rep("b", 3)),
            day = c(1, 1, 1, 2, 1, 2, 3),
            price = c(500, 10, 100, rep(10, 3), 100),
            code = c("a", "b", "c", rep("b", 3), "c"),
            freq = c(rep(1, 5), rep(2, 2))))

> x
  id day price code freq
1  a   1   500    a    1
2  a   1    10    b    1
3  a   1   100    c    1
4  a   2    10    b    1
5  b   1    10    b    1
6  b   2    10    b    2
7  b   3   100    c    2

Таким образом, затраты для пациента "a" для первого дня будут 600, а не 610 какЯ могу вычислить следующее:

x %>% 
  group_by(id, day) %>% 
  summarise(res = sum(price * freq))

# A tibble: 5 x 3
# Groups:   id [?]
  id      day   res
  <fct> <dbl> <dbl>
1 a        1.  610.
2 a        2.   10.
3 b        1.   10.
4 b        2.   20.
5 b        3.  200.

Возможные подходы

Либо я удаляю наблюдение code "b", когда«с» присутствует на том же самомдень или я установил freq из code "b" в 0 в случае, если code "c" присутствует в тот же день.

Все мои попытки с ifelse и mutate потерпели неудачу, поэтомудалеко.

Каждая помощь очень ценится.Заранее большое спасибо!

Ответы [ 2 ]

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

Вы можете создать новый столбец следующим образом:

mutate(code_day = paste0(ifelse(code %in% c("b", "c"), "z", code), day)

Тогда все ваши буквы B и C станут Zs (без потери исходного столбца кода, который поможет вам отличить их друг от друга).Затем вы можете упорядочить по убыванию кода и удалить повторяющиеся значения в столбце code_day:

arrange(desc(code)) %>% # Bs will come after Cs
distinct(code_day, .keep_all = TRUE)
0 голосов
/ 07 июня 2018

Вы можете добавить строку filter, чтобы удалить ошибочные значения b, подобные этому ...

x %>% 
  group_by(id, day) %>% 
  filter(!(code=="b" & "c" %in% code)) %>% 
  summarise(res = sum(price * freq))

  id      day   res
  <fct> <dbl> <dbl>
1 a        1.  600.
2 a        2.   10.
3 b        1.   10.
4 b        2.   20.
5 b        3.  200.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...