मुझे डेटासेट करना है, एक कुछ स्थान (लैट, लॉन) के साथ, वह परीक्षण है, और एक एनवाईसी में सभी ज़िप कोड की लेट/लोन जानकारी वाला है, वह test2 है।

test <- structure(list(trip_count = 1:10, dropoff_longitude = c(-73.959862, 
                                                        -73.882202, -73.934113, -73.992203, -74.00563, -73.975189, -73.97448, 
                                                        -73.974838, -73.981377, -73.955093), dropoff_latitude = c(40.773617, 
                                                                                                                  40.744175, 40.715923, 40.749203, 40.726158, 40.729824, 40.763599, 
                                                                                                                  40.754135, 40.759987, 40.765224)), row.names = c(NA, -10L), class = c("tbl_df", 
                                                                                                                                                                                        "tbl", "data.frame"))
test2 <- structure(list(latitude = c(40.853017, 40.791586, 40.762174, 
40.706903, 40.825727, 40.739022, 40.750824, 40.673138, 40.815559, 
40.754591), longitude = c(-73.91214, -73.94575, -73.94917, -73.82973, 
-73.81752, -73.98205, -73.99289, -73.81443, -73.90771, -73.976238
), borough = c("Bronx", "Manhattan", "Manhattan", "Queens", "Bronx", 
"Manhattan", "Manhattan", "Queens", "Bronx", "Manhattan")), class = "data.frame", row.names = c(NA, 
-10L))

मैं अब इन दो डेटासेट में शामिल होने का प्रयास कर रहा हूं ताकि अंत में प्रत्येक trip_count के लिए मुझे एक borough मिले। अब तक मैंने इसके लिए difference_left_join का प्रयोग इस प्रकार किया है:

test %>% fuzzyjoin::difference_left_join(test2,by = c("dropoff_longitude" = "longitude" , "dropoff_latitude" = "latitude"), max_dist = 0.01)

भले ही यह दृष्टिकोण काम करता है, जैसे-जैसे डेटासेट बड़े होते जाते हैं, यह जुड़ाव बहुत सारे मैच बनाता है और इसलिए मैं एक डेटासेट के साथ समाप्त होता हूं जो कभी-कभी एक से दस गुना बड़ा होता है test। क्या किसी के पास मल्टीपाइल मैच बनाए बिना इसे हल करने का एक अलग तरीका है? या क्या कोई ऐसा तरीका है जिससे मैं शामिल होने के लिए हमेशा test में प्रत्येक पंक्ति के लिए एक मैच का उपयोग करने के लिए बाध्य कर सकता हूं? मैं इसकी अत्यधिक सराहना करूंगा!

संपादित करें: इस समस्या का समाधान R dplyr लेफ्ट जॉइन - कई लौटाए गए मान और नई पंक्तियाँ: केवल पहले मैच के लिए कैसे पूछें? मेरा समाधान भी करेगा। तो शायद आप में से किसी को इसके बारे में अंदाजा हो!

3
Max S 5 पद 2020, 21:47

1 उत्तर

सबसे बढ़िया उत्तर

आप geo_join फ़ंक्शन कर सकते हैं और मैचों के बीच की दूरी वापस कर सकते हैं और फिर निकटतम मैच में फ़िल्टर कर सकते हैं।

library(fuzzyjoin)
library(dplyr)

answer <-geo_left_join(test, test2, by = c("dropoff_longitude" = "longitude" , "dropoff_latitude" = "latitude"), 
                   max_dist = 2, distance_col = "dist") %>% 
         select(-"longitude", -"latitude")

answer  %>% group_by(trip_count) %>% slice_min(dist)

आप मैचों की संख्या को कम करने के लिए "max_dist" के लिए मान को समायोजित करना चाह सकते हैं, इससे प्रदर्शन में सुधार होना चाहिए लेकिन बहुत अधिक NA उत्पन्न हो सकते हैं।

अपडेट करें
३ दशमलव स्थानों तक गोलाई ज़्यादा से ज़्यादा ७० मीटर/२३० फ़ुट ऑफ़सेट है। दशमलव अंकों को कम करने से अद्वितीय बिंदुओं की संख्या कम हो जाती है लेकिन अधिकतम ऑफ़सेट बढ़ जाता है।

यहां बताया गया है कि मैं ड्रॉप-ऑफ लोकेशन को राउंड करने और जॉइन करने का काम कैसे करूंगा। यह जटिलता जोड़ता है, लेकिन स्मृति मुद्दों में मदद कर सकता है। मैंने यहां group_by फ़ंक्शन पर विचार नहीं किया है, लेकिन यह काम भी कर सकता है।

#create a unique id for each rounded lon & lat
test$hash <-paste(round(test$dropoff_longitude, 3), round(test$dropoff_latitude, 3))
#the unique ids
uniques <- which(!duplicated(test$hash))
#create a reduced size data frame 
reduced <- data.frame(hash= test$hash, 
                      dropoff_longitude = round(test$dropoff_longitude, 3), 
                      dropoff_latitude = round(test$dropoff_latitude, 3))[uniques,]

#Preform matching here
#using the formula above or something else.
# adding the matched column onto the reduced dataframe
    reduced$matched <- letters[1:nrow(reduced)]
#this example is just adding on a column of letters

#merge back to the original adata set
test %>% left_join(reduced[ , c("hash", "matched")], by=("hash"))
3
Dave2e 6 पद 2020, 21:33