У меня есть набор данных = data1 с идентификатором и адресами электронной почты следующим образом:
id emails
1 A,B,C,D,E
2 F,G,H,A,C,D
3 I,K,L,T
4 S,V,F,R,D,S,W,A
5 P,A,L,S
6 Q,W,E,R,F
7 S,D,F,E,Q
8 Z,A,D,E,F,R
9 X,C,F,G,H
10 A,V,D,S,C,E
У меня есть другой набор данных = data2 с check_email следующим образом:
check_email
A
D
S
V
Я хочу проверить, присутствует ли столбец check_email в data1, и хочу использовать только те идентификаторы из data1, когда check_email в data2 присутствует в электронных письмах в data1.
Мой желаемый результат будет:
id
1
2
4
5
7
8
10
Я создал код, использующий цикл for, но он занимает вечность, потому что мой фактический набор данных очень большой. Любые советы на этот счет будут высоко оценены!
3 ответа
Вы можете использовать регулярное выражение для подмножества ваших данных. Сначала сверните все по одной схеме:
paste(data2$check_email, collapse = "|")
# [1] "A|D|S|V"
Затем создайте вектор-индикатор соответствия шаблона электронной почте:
grep(paste(data2$check_email, collapse = "|"), data1$emails)
# [1] 1 2 4 5 7 8 10
А затем объединить все:
data1[grep(paste(data2$check_email, collapse = "|"), data1$emails), ]
# id emails
# 1 1 A,B,C,D,E
# 2 2 F,G,H,A,C,D
# 3 4 S,V,F,R,D,S,W,A
# 4 5 P,A,L,S
# 5 7 S,D,F,E,Q
# 6 8 Z,A,D,E,F,R
# 7 10 A,V,D,S,C,E
Мы можем разбить элементы вектора символов as.character(data1$emails)
на подстроки, затем мы можем перебрать этот список с sapply
, ища any
значение этой подстроки, содержащейся в data2$check_email
. Наконец, мы извлекаем эти значения из data1
> emails <- strsplit(as.character(data1$emails), ",")
> ind <- sapply(emails, function(emails) any(emails %in% as.character(data2$check_email)))
> data1[ind,"id", drop = FALSE]
id
1 1
2 2
4 4
5 5
7 7
8 8
10 10
data1[rowSums(sapply(data2$check_email, function(x) grepl(x,data1$emails))) > 0, "id", F]
id
1 1
2 2
4 4
5 5
7 7
8 8
10 10
Новые вопросы
r
R - это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальные и воспроизводимые примеры вместе с желаемым результатом. Используйте dput () для данных и укажите все небазовые пакеты с вызовами library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. По вопросам, связанным со статистикой, используйте https://stats.stackexchange.com.