मेरे पास ४०३ पंक्तियों और ५ कॉलमों के साथ पैरेंट क्वेरी डेटा.फ्रेम है, जहां मैं लक्ष्य डेटा में डेटा को फ़िल्टर करने के लिए संदर्भ कॉलम के रूप में इसके NUTS_ID और NUTS_NAME का उपयोग करने वाला हूं। फ्रेम्स (४२७ पंक्तियां और ७ कॉलम), कृपया उदाहरण के लिए डेटा स्निपेट देखें। ऐसा करने के लिए, मैंने क्वेरी data.frame में code कॉलम का उपयोग करके लक्ष्य डेटा.फ़्रेम में सामान्य पंक्तियाँ प्राप्त करने के लिए base::match की कोशिश की, लेकिन यह कुशल नहीं है क्योंकि पैटर्न सुसंगत नहीं है।

यहाँ क्वेरी डेटा का प्रमुख है। फ्रेम:

> query_df
     CNTR_CODE   FID LEVL_CODE NUTS_ID                  NUTS_NAME
  1:        DE DEF0D         3   DEF0D                   Segeberg
  2:        DE DEF0E         3   DEF0E                  Steinburg
  3:        DE DEF0F         3   DEF0F                   Stormarn
  4:        DE DEG01         3   DEG01   Erfurt, Kreisfreie Stadt
  5:        DE DE119         3   DE119             Hohenlohekreis
 ---                                                             
398:        DE DEG0K         3   DEG0K           Saale-Orla-Kreis
399:        DE DEG0L         3   DEG0L                      Greiz
400:        DE DEG0M         3   DEG0M           Altenburger Land
401:        DE DEG0N         3   DEG0N Eisenach, Kreisfreie Stadt
402:        DE DEG0P         3   DEG0P              Wartburgkreis

लक्ष्य data.frames के स्निपेट यहां दिए गए हैं:

> target_df
     Country                       Name
  1:   de111      Stuttgart, Stadtkreis
  2:   de112                  Böblingen
  3:   de113                  Esslingen
  4:   de114                  Göppingen
  5:   de115                Ludwigsburg
 ---                                   
423:   deg0k           Saale-Orla-Kreis
424:   deg0l                      Greiz
425:   deg0m           Altenburger Land
426:   deg0n Eisenach, Kreisfreie Stadt
427:   deg0p              Wartburgkreis

यहाँ उदाहरण डेटा स्निपेट को पढ़ने का मेरा प्रयास है:

library(openxlsx)
query_df <- read.xlsx("example_data_snippets.xlsx", sheet = 1)
target_df1 <- read.xlsx('example_data_snippets.xlsx', sheet = 2)

क्वेरी data.frame में संदर्भ कॉलम कुंजी का उपयोग करके लक्ष्य डेटा.फ़्रेम में डेटा फ़िल्टर करने के लिए, मैंने बस अनुसरण के रूप में प्रयास किया:

target_df1[match(query_df$NUTS_ID, target_df$Country),]

लेकिन इसने मुझे त्रुटि दी, शायद मेरा उपरोक्त प्रयास ऊपरी केस कोड और मिलान के लिए निचले मामले से निपट नहीं सकता है।

वांछित आउटपुट:

मेरे वांछित आउटपुट में, फ़िल्टर किए गए डेटा.फ़्रेम में समान कोड हो सकता है, NUTS_ID मिलान ढूंढकर।

मैं अपने उपरोक्त समाधान को कैसे अनुकूलित कर सकता हूं? क्या क्वेरी डेटा.फ़्रेम में संदर्भ कॉलम का उपयोग करके डेटा को एकाधिक डेटा.फ़्रेम में फ़िल्टर करने का कोई कारगर तरीका है? क्या dplyr या data.table में कोई कुशल उपयोगिता है? क्या ऐसा करने का कोई कारगर तरीका है? कोई विचार?

0
Hamilton 21 मई 2018, 21:30

1 उत्तर

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

मैं openxlsx के बजाय readxl का उपयोग करता हूं; यह सिर्फ वरीयता का मामला है। एक साथ टेबल में शामिल होने में सक्षम होने के लिए देश पर टॉपर का उपयोग करना।

library(readxl)

query_df <- read_excel("example_data_snippets.xlsx", sheet = 1)
target_df1 <- read_excel('example_data_snippets.xlsx', sheet = 2)


target_df1 %>% 
  mutate(Country = toupper(Country)) %>% 
  inner_join(query_df, by = c("Country" = "NUTS_ID"))
# A tibble: 357 x 12

या अगर query_df के डेटा की जरूरत नहीं है तो एक semi_join का उपयोग किया जा सकता है।

target_df1 %>% 
  mutate(Country = toupper(Country)) %>% 
  semi_join(query_df, by = c("Country" = "NUTS_ID"))
# A tibble: 357 x 8

सभी फाइलों को 1 परिणामी सूची में लोड करें:

query_df <- read_excel("example_data_snippets.xlsx", sheet = 1)
target_df1 <- read_excel('example_data_snippets.xlsx', sheet = 2)
# need to skip first line :-( otherwise could automate reading in all sheets in one go.
target_df2 <- read_excel('example_data_snippets.xlsx', sheet = 3, skip = 1)
target_df3 <- read_excel('example_data_snippets.xlsx', sheet = 4, skip = 1)

#set nuts_id to lower so it matches all the Country names in the other sheets.
query_df$NUTS_ID <- tolower(query_df$NUTS_ID)     


result <- lapply(list(target_df1, target_df2, target_df3), function(x) inner_join(query_df, x, by = c("NUTS_ID" = "Country")))  
1
phiver 24 मई 2018, 16:48