Как узнать, какие элементы одного набора находятся в другом наборе? - PullRequest
4 голосов
/ 26 октября 2011

У меня есть два набора: A со столбцами x, y и B также со столбцами x, y. Мне нужно найти индекс строк A, которые находятся внутри B (оба x и y должны совпадать). Я пришел к простому решению (см. Ниже), но это сравнение внутри цикла, и paste добавляет гораздо больше дополнительного времени.

B <- data.frame(x = sample(1:1000, 1000), y = sample(1:1000, 1000))
A <- B[sample(1:1000, 10),]
#change some elements
A$x[c(1,3,7,10)] <- A$x[c(1,3,7,10)] + 0.5

A$xy <- paste(A$x, A$y, sep='ZZZ')
B$xy <- paste(B$x, B$y, sep='ZZZ')
indx <- which(A$xy %in% B$xy)
indx

Например, для одного наблюдения альтернатива paste почти в 3 раза быстрее

    ind <- sample(1:1000, 1)
    xx <- B$x[ind]
    yy <- B$y[ind]

    ind <- which(with(B, x==xx & y==yy))
    # [1] 0.0160000324249268 seconds
    xy <- paste(xx,'ZZZ',yy, sep='')
    ind <- which(B$xy == xy)
    # [1] 0.0469999313354492 seconds

1 Ответ

2 голосов
/ 26 октября 2011

Как насчет использования merge() для сопоставления?

A$id <- seq_len(nrow(A))
sort(merge(A, B)$id)
# [1] 2 4 5 6 8 9

Редактировать:

Или, чтобы избавиться от two ненужные сортировки, используйте опцию sort= для merge()

merge(A, B, sort=FALSE)$id
# [1] 2 4 5 6 8 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...