Я пытаюсь определить группы в наборе данных, в которых значения конкретной переменной различаются.
Например, в приведенных ниже данных у меня было четыре пациента, и я назначил по три встречи для просмотра каждой.
dat <- structure(list(patient = c('John', 'John', 'John', 'Jean', 'Jean', 'Jean', 'Jack', 'Jack', 'Jack', 'Jess', 'Jess', 'Jess'),
status = c('Well', 'Well', 'Well', 'Well', 'Sick', 'Well', 'DNA', 'DNA', 'DNA', 'DNA', 'Well', 'Well')), class = "data.frame", row.names = c(NA, -12L))
Иногда они были здоровы, иногда болели, а иногда не посещали (ДНК).
Я легко вижу, что статус по крайней мере некоторых из них различался между назначениями:
nrow(unique(dat)) == length(unique(dat$patient))
# gives FALSE
Я пытаюсь выяснить, какие пациенты имеют разные статусы.
Лучшее, что у меня есть, это:
# function to find if all elements of a vector are the same
all_same <- function(x) all(x == x[1])
# split table and apply function
sapply(split(dat$status, dat$patient), all_same)
Это работает, но у меня естьбольшой набор данных со многими группами (т.е. пациентов).Кажется, я сталкиваюсь с этой конкретной проблемой довольно часто.Я чувствую, что должен быть элегантный и векторизованный способ сделать это.Я знаю, что могу повысить скорость моего подхода с помощью dplyr / data.table, но я могу думать только о подходах, которые разделяют данные, а затем зацикливают функцию на группы.Каков наилучший способ сделать это?