#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)