R сумма нескольких строк со многими переменными - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть некоторые методы лечения (A, B, C, D и т. Д.) С 4 состояниями (z, y, x, v и т. Д.) И суммой раз, когда они использовались для пациентов (строки).

Пример:

treatments = tibble(treatment = rep(c("A","B","AB"), 4), 
       condition = rep(c("z","y","x","v"),3), 
       n_times_used = 10:21) %>% 
  arrange (treatment)

Иногда применяется также комбинированное лечение АБ. Я хочу написать функцию, которая: 1. Проверяет, присутствует ли комбинированная обработка AB в текущем наборе данных 2. Если да, я хочу, чтобы номера AB добавлялись как к номерам «A», так и к номерам «B», но только в отношении condition. После добавления AB следует удалить из набора данных

Например: в прошлом месяце у меня было 100 пациентов с Az (лечение A, состояние z), 150 пациентов с Bz, 40 пациентов с Cz и 70 пациентов с ABz. Таким образом, числа, которые я хочу в моей обобщенной таблице, являются Az = 170; Bz = 220, Cz = 40.

Я пытаюсь построить что-то вроде

treatments %>%
   {stopifnot(any(.$treatment == "AB", na.rm = T))} %>%
   group_by(condition) %>%
 mutate(n_times_used = if_else(treatment=="A", 
                        true = sum(n_times_used[which(.$treatment== "A")], n_times_used[which(.$treatment== "AB")]), 
                        false = n_times_used))

То же самое с B + AB, а затем фильтр, чтобы удалить AB из таблицы. Все еще есть ошибки в коде ...

ОБНОВЛЕНИЕ 1. Пример с лечением C

Я добавляю еще один пример, потому что в первом были включены только процедуры A и B. Если у нас есть лечение C, мне не нужно добавлять AB к нему.

treatments_ABC = tibble(treatment = rep(c("A","B","AB","C"), 3), 
                    condition = rep(c("z","y","x"), 4), 
                    n_times_used = round(abs(rnorm(n = 12, mean = 10, sd = 30)))) %>% 
  arrange (treatment)

ОБНОВЛЕНИЕ 2. Пример с обработкой A или B отсутствует

treatments_BC = tibble(treatment = rep(c("B","AB","C"), 4), 
                       condition = rep(c("z","y","x","v"), 3), 
                       n_times_used = round(abs(rnorm(n = 12, mean = 10, sd = 30)))) %>% 
  arrange (treatment)

1 Ответ

0 голосов
/ 01 ноября 2018

Мы можем использовать if/else условие

library(dplyr)
treatments %>% 
   group_by(condition) %>% 
   mutate(n_times_used = if("AB" %in% treatment) n_times_used + 
     n_times_used[treatment == "AB"] 
           else n_times_used) %>% 
   filter(treatment != "AB")

Здесь мы должны предположить, что для каждого «условия» существует один «AB» (как показано в примере)


Если у нас есть и другие элементы, относящиеся к «лечению» и не влияющие на них, то мы выполняем задание, основанное на исключении этих элементов

treatments_ABC %>%
    group_by(condition) %>%
    mutate(n_times_used = ifelse(treatment %in% c("A", "B", "AB") & 
         "AB" %in% treatment, 
             n_times_used + n_times_used[treatment == "AB"], 
              n_times_used)) %>% 
    filter(treatment != "AB")

library(data.table)
setDT(treatments_ABC)[treatment %chin% c("A", "B", "AB"), 
   n_times_used := n_times_used + n_times_used[treatment == "AB"], by = condition]
treatments_ABC[treatment != "AB"]
...