Функция для сравнения строк между собой определенного столбца с одинаковым идентификатором - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть большая лабораторная база данных, некоторые идентификаторы имеют несколько результатов, я также создал еще одну ключевую переменную с инициалами + возраст + половые переменные для других целей сопоставления с медицинскими картами больницы. Однако я заметил, что иногда разные инициалы имеют одинаковый идентификатор больницы. Я хочу написать функцию для обнаружения этой несогласованности.

Итак, пример базы данных:

df=data.frame(ID=c("5606","5606","5728","5824","5824","5824","5824"),
                     key2=c("TN35M","TN35M","JJ26M","CD47F","CD47F","DG44M","DG44M"),
              date_sample=c("12/03/2012","12/03/2012","19/04/2012","21/05/2012","21/05/2012","19/10/2012","19/10/2012"), service=c("ORTHO","ORTHO","BLOC","VISC","VISC","BLOC","BLOC"), germe=c("Acinetobacter sp","Burkholderia pseudomallei","Stenotrophomonas maltophilia","Staphylococcus haemolyticus"," Enterobacter cloacae","Escherichia  coli","Pseudomonas aeruginosa"))


ID      key2    date_sample service germe

5606    TN35M   12/03/2012  ORTHO   Acinetobacter sp
5606    TN35M   12/03/2012  ORTHO   Burkholderia pseudomallei
5728    JJ26M   19/04/2012  BLOC    Stenotrophomonas maltophilia
5824    CD47F   21/05/2012  VISC    Staphylococcus haemolyticus
5824    CD47F   21/05/2012  VISC    Enterobacter cloacae
5824    DG44M   19/10/2012  BLOC    Escherichia coli
5824    DG44M   19/10/2012  BLOC    Pseudomonas aeruginosa

Каждый идентификатор должен иметь одну уникальную переменную key2. Как я могу сравнить строки переменной «key2» для одной и той же переменной «ID» и иметь выходную переменную для обнаружения всех строк с несогласованностью, чтобы быть уверенным, что каждый идентификатор присвоен одному уникальному пациенту, но не используется более чем1 пациент?

как:


ID       key2   date_sample service germe                        incoherence

5606    TN35M   12/03/2012  ORTHO   Acinetobacter sp                N
5606    TN35M   12/03/2012  ORTHO   Burkholderia pseudomallei       N
5728    JJ26M   19/04/2012  BLOC    Stenotrophomonas maltophilia    N
5824    CD47F   21/05/2012  VISC    Staphylococcus haemolyticus     Y
5824    CD47F   21/05/2012  VISC    Enterobacter cloacae            Y
5824    DG44M   19/10/2012  BLOC    Escherichia coli                Y
5824    DG44M   19/10/2012  BLOC    Pseudomonas aeruginosa          Y

Ответы [ 3 ]

1 голос
/ 04 ноября 2019

Использование dplyr

library(dplyr)
df %>%
 group_by(ID) %>%
 mutate(incoherence = c("N", "Y")[(n_distinct(key2) > 1) +1])

#   ID    key2 incoherence
#  <fct> <fct> <chr>      
#1 5606  TN35M N          
#2 5606  TN35M N          
#3 5728  JJ26M N          
#4 5824  CD47F Y          
#5 5824  CD47F Y          
#6 5824  DG44M Y          
#7 5824  DG44M Y       

и data.table

library(data.table)
setDT(df)[, incoherence := c("N", "Y")[(uniqueN(key2) > 1) +1], by = ID]
1 голос
/ 04 ноября 2019

Вы можете посчитать уникальные значения каждой группы. Если больше 1, то Y (или в данном случае TRUE), т.е.

!with(df, ave(key2, ID, FUN = function(i) length(unique(i)))) == 1
#[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE

ПРИМЕЧАНИЕ: Убедитесь, что ваши переменные являются символами, а не факторами

0 голосов
/ 04 ноября 2019

Ваш вопрос не содержит какой-либо ясности, что вы ожидаете от incoherence с key2, и id вы можете уточнить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...