Как согласовать два разных идентификатора как один, затем применить к df с обоими идентификаторами, но считать объект только один раз в R?

#r #join #data-wrangling

#r #Присоединиться #перебор данных

Вопрос:

У меня есть два разных идентификатора для одного и того же субъекта (пациента). В этом другом векторе идентификаторов оба идентификатора указывают на одного и того же пациента. Как мне посчитать пациента только один раз (по ID1) вместо двух разных пациентов с разными идентификаторами?

 ID1 ID2 
 11 12
 13 14
 15 16
 

вектор

 11,12,13,13,14,16
 

Я хочу считать только уникальных пациентов по ID1, чтобы я получил

 x=11,13,15
 

Спасибо!

Комментарии:

1. Разве выходные данные не должны быть 11, 13, 16?

2. Нет, переход по ID1

3. Тогда зачем вам vector вообще нужно? Это было бы просто df$ID1 ? Если это не то, что вы хотите, возможно, приведите лучший пример.

Ответ №1:

Я думаю, вероятно, вам это нужно

 df %>% filter((ID1 %in% vector) | (ID2 %in% vector)) %>%
   select(ID1)

  ID1
1  11
2  13
3  15
 

Проверьте это на лучшем примере

 df <- structure(list(ID1 = c(11L, 13L, 15L, 17L, 19L, 21L), ID2 = c(12L, 
14L, 16L, 18L, 20L, 22L)), class = "data.frame", row.names = c(NA, 
-6L)

> df
  ID1 ID2
1  11  12
2  13  14
3  15  16
4  17  18
5  19  20
6  21  22


vector <- c(11, 12, 13, 13, 14, 16, 18, 18)

> df %>% filter((ID1 %in% vector) | (ID2 %in% vector)) %>% select(ID1)
  
   ID1
1  11
2  13
3  15
4  17
 

Слегка изменив код Ronak, вы можете получить те же результаты

 df %>%
  mutate(ID = row_number()) %>%
  tidyr::pivot_longer(cols = c(ID1, ID2)) %>%
  inner_join(tibble::enframe(vector), by = 'value') %>%
  distinct(ID, .keep_all = T) %>%
  select(ID, value) %>%
  inner_join(df %>% mutate(ID = row_number()), by = 'ID') %>%
  select(ID1)
 

Ответ №2:

Создайте уникальный ID номер для каждого пациента, получите данные в длинном формате, чтобы оба идентификатора были в одном столбце, соедините его с вектором выберите векторные значения для разных ID значений.

 library(dplyr)

df %>%
  mutate(ID = row_number()) %>%
  tidyr::pivot_longer(cols = c(ID1, ID2)) %>%
  inner_join(tibble::enframe(vector), by = 'value') %>%
  distinct(ID, .keep_all = TRUE) %>%
  select(value)

#  value
#  <dbl>
#1    11
#2    13
#3    16
 

данные

 df <- structure(list(ID1 = c(11L, 13L, 15L), ID2 = c(12L, 14L, 16L)), 
class = "data.frame", row.names = c(NA, -3L))
vector <- c(11, 12, 13, 13, 14, 16)
 

Комментарии:

1. Я думаю, что OP хочет получить результаты ID1 только от. Пожалуйста, посмотрите Небольшое изменение в вашем коде в конце моего ответа.

Ответ №3:

Вы можете использовать any with %in% , выбрав строки с apply подмножеством ID1 to .

 ID$ID1[apply(ID, 1, function(z) any(v %in% z))]
#[1] 11 13 15
 

или использовать rowSums .

 ID$ID1[rowSums(sapply(ID, "%in%", v)) > 0]
#[1] 11 13 15
 

Данные:

 ID <- read.table(header=TRUE, text="ID1 ID2 
 11 12
 13 14
 15 16")
v <- c(11,12,13,13,14,16)