Выбор идентификатора на основе иерархических критериев - PullRequest
1 голос
/ 26 мая 2020

Привет. У меня есть группа пациентов, у которых определенное заболевание (но с разными критериями) было диагностировано в разные даты, а именно:

ID1 = c(12,14,56)
Date_ID1 = c(20160209,20120101, 20170227)
Criteria_1 = c("B","C","A")

ID2 = c(NA,43,22)
Date_ID2 = c(NA,20160710,20170227)
Criteria_2 = c(NA,"B","B")

ID3 = c(96,41,123)
Date_ID3 = c(20170227,20120101,20160601)
Criteria_3 = c("A","B","A") 

test = data.frame(ID1, Criteria_1,Date_ID1,ID2, Criteria_2,Date_ID2,ID3,Criteria_3,Date_ID3)

Каждая строка представляет одного и того же пациента, новый идентификатор присваивается при каждом обследовании. Мне нужно выбрать один идентификатор для каждой строки на основе иерархических критериев (A> B> C); в случае совпадения выбранный идентификатор должен соответствовать самой ранней дате этого диагноза. Ожидается, что результат будет выглядеть следующим образом:

cbind(test,data.frame(Selected_ID = c(96,41,123)) )

Любые предложения приветствуются.

1 Ответ

1 голос
/ 26 мая 2020

Я добавляю идентификатор строки к вашему test.

testR = data.frame(ID1, Criteria_1,Date_ID1,ID2 ,Criteria_2,Date_ID2,ID3,Criteria_3,Date_ID3) %>% 
  rowid_to_column("ROW")


library(tidyverse)
library(lubridate)

pivot_longer тремя способами. (Я думаю, что мог бы сделать это за один раз sw oop, но мне это легче понять. Я разбиваю этот конвейер на отдельные части, чтобы вы могли оценить их по отдельности и посмотреть, что происходит. Но я не печать промежуточных результатов; делает сообщения слишком длинными

piv3 <- testR %>% 
  pivot_longer(cols = starts_with("Criteria"),
               names_to = "Criteria_L",
               values_to = "CritLetter")  %>% 
  pivot_longer(cols = starts_with("Date"),
               names_to = "Date_L",
               values_to = "Date") %>% 
  pivot_longer(cols = starts_with("ID"),
               names_to = "ID_L",
               values_to = "ID") 


clnPiv <- piv3 %>% 
  filter(!is.na(ID)) %>% 
  mutate(Date = ymd(Date)) %>% 
  mutate_at(vars(matches("_L")), ~ str_sub(., -1)) %>% 
  filter(Criteria_L == Date_L & Date_L == ID_L)

Я распечатаю clnPiv, tho

# A tibble: 8 x 7
    ROW Criteria_L CritLetter Date_L Date       ID_L     ID
  <int> <chr>      <fct>      <chr>  <date>     <chr> <dbl>
1     1 1          B          1      2016-02-09 1        12
2     1 3          A          3      2017-02-27 3        96
3     2 1          C          1      2012-01-01 1        14
4     2 2          B          2      2016-07-10 2        43
5     2 3          B          3      2012-01-01 3        41
6     3 1          A          1      2017-02-27 1        56
7     3 2          B          2      2017-02-27 2        22
8     3 3          A          3      2016-06-01 3       123


selexId <- clnPiv %>% 
  group_by(ROW) %>% 
  arrange(CritLetter, Date) %>% 
  summarise(SelectedID = first(ID))

testR %>% 
  left_join(selexId, by = "ROW")


  ROW ID1 Criteria_1 Date_ID1 ID2 Criteria_2 Date_ID2 ID3 Criteria_3 Date_ID3 SelectedID
1   1  12          B 20160209  NA       <NA>       NA  96          A 20170227         96
2   2  14          C 20120101  43          B 20160710  41          B 20120101         41
3   3  56          A 20170227  22          B 20170227 123          A 20160601        123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...