У меня большой фрейм данных (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 больше столбцов). Любая помощь будет принята с благодарностью!
Спасибо!