Мутировать с case_when, когда набор данных длинного формата dplyr - PullRequest
1 голос
/ 26 сентября 2019

Допустим, у меня есть набор данных, по которому собраны все медицинские консультации.Поскольку у меня есть некоторый интервал времени, у меня будет мера 1,2, ..., n.

Теперь я хочу сравнить результаты, полученные в первой точке измерения (базовой линии), со следующими результатами.Если разница во втором, третьем, четвертом (и т. Д.) Измерении меньше 0,5, этот результат в порядке;но если нет никакой разницы, результат не в порядке.

Это простое действие, когда у нас есть набор данных в широком формате, но я работаю с длинным форматом в рамках dplyr.

Мой набор данных выглядит так:

dataset

Я думаю, что-то в этом направлении может быть в порядке, но у меня есть некоторые сообщения об ошибках ..

ds <- ds %>% 
  group_by(id) %>% 
  mutate(
    improvement = 
      case_when(result[time != "Baseline"] - result[time == "Baseline"] <= 0.5 ~ 1)
  )

Воспроизвести анализы:

ds <- structure(list(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 
                              4, 4, 5, 5, 5, 6, 6, 6), group = c("AG", "AG", "AG", 
                                                                         "AG", "AG", "AG", "AG", "AG", "AG", "BG", "BG", "BG", "BG", "BG", 
                                                                         "BG", "BG", "BG", "BG"), time = structure(c(1L, 2L, 3L, 1L, 2L, 
                                                                                                                     3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("Baseline", 
                                                                                                                                                                                     "Post-intervention", "3-month follow-up"), class = "factor"), 
                     result = c(1.2, 0.2, 0.2, 0.7, 0.2, 0.2, 1, 0.2, 0.2, 0.7, 
                               0.9, 0.5, 1, 0.6, 0.2, 3.3, 0.2, 0.2)), class = c("tbl_df", 
                                                                                 "tbl", "data.frame"), row.names = c(NA, -18L))
d

1 Ответ

1 голос
/ 26 сентября 2019

case_when ожидает, что аргументы имеют одинаковую длину.Если мы сделаем подмножество, это может вызвать реакцию, потому что один из компонентов не соответствует по длине.Один из вариантов после группировки по 'id' состоит в том, чтобы вычесть 'результат' из случая, когда 'time' - это "Baseline" (чтобы учесть случай, когда есть несколько дубликатов "Baseline", взять первый элемент), вычесть исделать сравнение

library(dplyr)
ds %>% 
   group_by(id) %>%
   mutate(improvement = case_when(result - result[time == "Baseline"][1] <= 0.5 ~ 1, 
           TRUE ~ NA_real_))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...