У меня есть набор данных = 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, но он занимает вечность, потому что мой фактический набор данных очень большой. Любые советы на этот счет будут высоко оценены!

r
1
user3642360 20 Авг 2018 в 18:04

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
1
kath 20 Авг 2018 в 15:14

Мы можем разбить элементы вектора символов 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
0
Jilber Urbina 20 Авг 2018 в 15:12
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
1
Lennyy 20 Авг 2018 в 15:13
51933608