У меня есть список пациентов IDs
, но они имеют два разных идентификатора (ID1 и ID2). Как узнать, какие пациенты на list
появились под обоими идентификаторами?
ID1 ID2
11 12
13 14
15 16
17 18
19 20
21 22
у меня есть список
list=c(11,13,14,15,16,18,18,19,20)
Мне нужно увидеть, какие пациенты появились под обоими идентификаторами, по ID1, чтобы я мог получить
>13,15,19
Спасибо!
да, так что в списке есть 11, потому что соответствующий ID2 "12" не появился в списке, поэтому 11 не появится в выводе. Также есть 13. И ID1, и ID2(13,14) появились в списке, так что 13 появится в выводе.
Мы могли бы перебрать набор данных с помощью lapply
, проверить, являются ли элементы %in%
объектом «список» (не рекомендуется называть объекты именами функций), Reduce
его в один логический вектор с помощью &
(это подразумевает ИСТИНА, только если оба столбца имеют значение в «списке»). Используйте логический индекс для подмножества значений "ID1"
df1$ID1[Reduce(`&`, lapply(df1, `%in%`, list))]
#[1] 13 15 19
Или еще вариант filter
с across
из dplyr
. Это будут filter
только те строки, в которых присутствуют значения обоих столбцов, а затем pull
столбец «ID1»
library(dplyr)
df1 %>%
filter(across(everything(), ~ . %in% list)) %>%
pull(ID1)
#[1] 13 15 19
df1 <- 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))
Вот базовый вариант R с использованием match
+ complete.cases
> df$ID1[complete.cases(sapply(df, match, table = lst))]
[1] 13 15 19
Используя sapply
, вы можете сделать:
df$ID1[rowSums(sapply(df, `%in%`, list)) == ncol(df)]
#[1] 13 15 19
Можете ли вы показать логику, используемую для сравнения