Найти идентичные парные значения между двумя фреймами данных - PullRequest
1 голос
/ 28 июня 2019

Я использую R для определения парных значений в двух столбцах фрейма данных, которые идентичны парным значениям в двух столбцах другого фрейма данных. Я думал, что нашел решение, но результат не совсем то, что я ожидал, и мне интересно, сможет ли кто-нибудь объяснить, почему.

df1 выглядит так:

Col1 Col2 Col3
A   1000    5
A   1500    10
A   2000    15
A   2500    20
B   900 5
B   1200    10
B   1500    15
C   1000    5
C   1200    10
C   1700    15
C   2200    20
C   2250    22  

df2 содержит то же содержимое, что и df1, плюс несколько дополнительных несовпадающих строк:

Col1 Col2 Col3
A   1000    5
A   1500    10
A   2000    15
A   2500    20
A   3000    20
A   3200    22
A   3400    25
B   900 5
B   1200    10
B   1500    15
B   1700    20
B   1900    26
C   1000    5
C   1200    10
C   1700    15
C   2200    20
C   2250    22
C   2400    25
C   3000    30
C   3500    31

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

x = subset(df1, Col1 %in% df2$Col1 & Col2 %in% df2$Col2)

, который возвращает ожидаемый результат:

Col1 Col2 Col3
A   1000    5
A   1500    10
A   2000    15
A   2500    20
B   900 5
B   1200    10
B   1500    15
C   1000    5
C   1200    10
C   1700    15
C   2200    20
C   2250    22

Однако, когда я переключаю, какой фрейм данных сравнивается с другим:

y = subset(df2, Col1 %in% df1$Col1 & Col2 %in% df1$Col2)

Я получаю идентичный результат, за исключением того, что теперь есть дополнительная строка B 1700 20:

Col1 Col2 Col3
A   1000    5
A   1500    10
A   2000    15
A   2500    20
B   900 5
B   1200    10
B   1500    15
B   1700 20
C   1000    5
C   1200    10
C   1700    15
C   2200    20
C   2250    22

Обратите внимание, что B 1700 20 не найден в df1, так почему он был возвращен в этом результате? Я думаю, что мой код не делает то, что, я думаю, он делает, возможно, парная природа Col1 и Col2 фактически не сохраняется между кадрами данных? Буду признателен за любые объяснения и предложения по улучшению моего кода!

1 Ответ

1 голос
/ 28 июня 2019

Это случай inner_join

library(dplyr)
out1 <- inner_join(df1, df2[1:2], by = c("Col1", "Col2"))
out2 <- inner_join(df1, df1[1:2], by = c("Col1", "Col2"))
identical(nrow(out1), nrow(out2))

Также обратите внимание, что intersect из dplyr может взять data.frame и вернуть data.frame

out1 <-  intersect(df1, df2)
out2 <- intersect(df2, df1)

В этом примере оба набора данных имеют одинаковые значения.Если мы хотим сравнить подмножество столбцов, подмножество наборов данных и выполните intersect.Разница в том, что мы получаем только эти столбцы в качестве вывода по сравнению с inner_join

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...