поиск почти идентичных строк между фреймами данных - PullRequest
3 голосов
/ 17 апреля 2019

У меня есть следующие два фрейма данных:

df1 = data_frame(x = c(1128.4, 1101.2), y = c(124.5, 325.2)

df2 = data_frame(x = c(1128.7, 1100.5, 1527.8, 1347.5), y = c(83.2, 124.2, 
370.3, 325.5))

Я хотел бы найти строки в df1, которые почти идентичны (разница 1% в любом направлении) со строками в df2, очень эффективным способом, чтобы сделать это для сотни строк в df1 против гораздо большего df2.

Ожидаемый результат будет, например, список:

L$x = c(1,2)
L$y = c(2,4)

для обозначения похожих строк в каждом столбце.

Если бы задачей было найти полностью идентичные строки, я бы, конечно, использовал left_join, где меньший df1 был бы слева.

Есть ли эффективный способ сделать это? (В общем, я хотел бы добиться этого и для нескольких столбцов).

Ответы [ 2 ]

3 голосов
/ 17 апреля 2019

с data.table, у вас будет самое быстрое решение:

library(data.table)
df1 = data.table(x = c(1128.4, 1101.2))
df2 = data.table(x = c(1128.7, 1100.5, 1527.8, 1347.5))

setkey(df2,x)
df2[,y := x]
df2[J(df1$x),roll = "nearest"][abs(x-y)/y < 0.01]

        x      y
1: 1128.4 1128.7
2: 1101.2 1100.5
2 голосов
/ 17 апреля 2019

Я не верю, что это самый эффективный метод, но одним из способов является использование Map передачи df1 и df2.Затем для каждого значения в df1 мы выбираем минимальный индекс абсолютной разницы в соответствующем значении в df2.

Map(function(x, y) sapply(x, function(i) which.min(abs(i - y))), df1, df2)

#$x
#[1] 1 2

#$y
#[1] 2 4

Для проверки состояния 1%

Map(function(x, y) sapply(x, function(i) {
    inds = abs(i - y)
    if (any(inds/y <= 0.01)) which.min(inds) else NA
}), df1, df2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...