Удалите последовательные дубликаты в строке с помощью RLE и проверьте логику последовательности в R

#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, в ожидании «возможных путей»)