#r #list #dataframe #run-length-encoding
#r #Список #фрейм данных #кодирование длины выполнения
Вопрос:
У меня есть проблема с двухэтапной очисткой данных для набора данных с путями пациента (например, Прибытие -gt; Зона А -gt;gt; Палата). Это пример того, как выглядят данные:
df lt;- data.frame(Patient = c(1,2,3,4,5), Area1 = c("Arrival1", "Arrival1", "Arrival2", "Arrival1", "Arrival2"), Area2 = c("Area A", "Diagnostics", "Area A", "Area B", NA), Area3 = c("Area B", "Diagnostics", "Area B", "Area A", NA), Area4 = c("Ward", "Ward", "Area B", "Area C", NA), Area5 = c(NA, NA, "Ward", "Arrival", NA) )
Шаг 1. Удаление дубликатов в последовательных столбцах Есть пациенты, у которых есть дубликаты в последовательных столбцах, например, для пациента 2 (Диагностика -gt; Диагностика) и пациента 3 (Область B -gt;gt; Область B). Мне нужно, чтобы это были уникальные пути.
Я решил эту проблему, используя apply()
и rle()
: df1 lt;- apply(df,1,rle)
Однако это дает мне (большой) список со значениями и длинами. Как я могу перенести это обратно в фрейм данных вышеуказанной формы (т. Е. Сохранить идентификатор пациента и значения)? Я пробовал различные версии do.call
, rbindlist()
и unlist()
, похоже, ни одна из них не работает для меня.
Шаг 2: Проверьте логику путей Предположим, что теперь у нас есть чистый набор данных:
dfclean lt;- data.frame(Patient = c(1,2,3,4,5), Area1 = c("Arrival1", "Arrival1", "Arrival2", "Arrival1", "Arrival2"), Area2 = c("Area A", "Diagnostics", "Area A", "Area B", NA), Area3 = c("Area B", "Ward", "Area B", "Area A", NA), Area4 = c("Ward", NA, "Ward", "Area C", NA), Area5 = c(NA, NA, NA, "Arrival", NA) )
Теперь мне нужно проверить логику путей. Для этого у меня есть второй набор данных, в котором перечислены все возможные пути, и мне нужно проверить для каждого пути в наборе данных 1, является ли этот путь «возможным» в соответствии с набором данных 2. Предположим, что набор данных 2 выглядит так:
df2 lt;- data.frame(Patient = c(1,2,3,4,5), Area1 = c("Arrival1", "Arrival1", "Arrival2", "Arrival1", "Arrival2"), Area2 = c("Area A", "Diagnostics", "Area A", "Area B", NA), Area3 = c("Area B", "Area A", "Area B", "Area A", NA), Area4 = c("Ward", "Ward", "Ward", "Area C", NA), Area5 = c(NA, NA, NA, NA, NA) )
Я хотел бы создать переменную, которая указывает TRUE для допустимых путей (например, Пациент 1) и FALSE для недопустимых путей (например, пациент 4). Я понятия не имею, как это сделать…
Комментарии:
1. Где находится ваш «второй набор данных» о возможных путях?
2. Это выше. «Предположим, что набор данных 2 выглядит следующим образом:»
3. Вы хотите сказать, что у каждого пациента разные возможные пути?
Ответ №1:
Шаг 1:
df[,-1] lt;- data.frame(t(apply(df[,-1], 1, function(z) { r lt;- rle(z) c(r$values, rep(NA, length(z) - length(r$values))) }))) df # Patient Area1 Area2 Area3 Area4 Area5 # 1 1 Arrival1 Area A Area B Ward lt;NAgt; # 2 2 Arrival1 Diagnostics Ward lt;NAgt; lt;NAgt; # 3 3 Arrival2 Area A Area B Ward lt;NAgt; # 4 4 Arrival1 Area B Area A Area C Arrival # 5 5 Arrival2 lt;NAgt; lt;NAgt; lt;NAgt; lt;NAgt;
Шаг 2: (tbd, в ожидании «возможных путей»)