Сопоставление двух кадров данных - не удается найти все совпадения, возможно, из-за проблемы с плавающей запятой? - PullRequest
0 голосов
/ 29 февраля 2020

У меня большой фрейм данных (dfA), и я пытаюсь найти строки в dfA, которые соответствуют меньшему df (dfB).

Это код для dfA

LAT<-seq(40.2,40.44465,.00027) 
LONG<-seq(-80, -71.5,.00027)

dfA<-data.frame(matrix(0, nrow = (length(LAT) * length(LONG)), ncol = 2))
colnames(dfA)<-c("LAT","LONG")
dfA[,"LAT"]<-rep(LAT,each=length(LONG))
dfA[,"LONG"]<-LONG
dim(dfA) #28554174        2

Это код для dfB

nLAT<-seq(40.2,40.44465,.027) 
nLONG<-seq(-80, -71.5,.027) 
dfB<-data.frame(matrix(0, nrow = (length(nLAT) * length(nLONG)), ncol = 2))
colnames(dfB)<-c("LAT","LONG")
dfB[,"LAT"]<-rep(nLAT,each=length(nLONG))
dfB[,"LONG"]<-nLONG
dim(dfB) #3150    2

Когда я соединяю два кадра данных, используя dplyr, чтобы найти строки в dfA , он не получает все строки из-за (возможно?) проблем с плавающей точкой.

library(dplyr)
df1<-inner_join(dfA,dfB,by=c("LAT","LONG")) 
dim(df1) #3130    2

Мне нужно, чтобы df1 имел 3150 строк. Это строки, которые не имеют соответствия

anti_df1<-anti_join(dfB,dfA,by=c("LAT","LONG"))
dim(anti_df1) #20  2

Я не уверен, является ли это проблемой с плавающей запятой или нет, так как этот код работает для некоторых строк. Я не хочу округлять (как предлагали некоторые посты), поскольку существует несколько уникальных значений.

dfA[which( (round(dfA$LAT,3)==40.200) & ((round(dfA$LONG,3)==-75.302)) ),]

Мне также нужен мой dfB, чтобы соответствовать LAT и LONG (2 значения), тогда как другие посты ищет только одно совпадение столбцов. Я открыт для того, чтобы не использовать dplyr, но это, кажется, самый быстрый способ найти подходящие строки (это очень упрощенный фрейм данных, так как у моего df больше столбцов). Любая помощь будет принята с благодарностью!

Спасибо!

...