json - आर(प्लस रेगएक्स जारी) के साथ डेटाफ्रेम में नेस्टेड जेएसओएन प्रकार कॉलम कैसे खोलें



r regex (1)

मैं आर के लिए बहुत नया हूँ, और मैं वर्तमान में इस समस्या पर फ़ंस रहा हूं: इसलिए मैंने एक JSON फ़ाइल आयात की है और पहले से ही *** इसे किसी डेटाफ़्रेम में कनवर्ट कर दिया है, अब मुझे शर्त के तहत पंक्तियों को वापस करने की आवश्यकता है:

जैसा कि आप चित्र में देख सकते हैं, मेरे पास एक कॉलम रिकॉर्डिंग घंटे (payload.hours) है मेरा लक्ष्य है कि मिलने वाले घंटों का पता लगाना है: 1. रविवार 2. समय 10 एएम से अधिक है।

मैंने कई तरह की कोशिश की, लेकिन किसी तरह यह बिल्कुल भी नहीं आ रहा है ... मैंने इस तरह नेस्टेड फॉर्म से पहले पेश किया है ... तो मुझे अपने विचार और मदद की ज़रूरत है ...

जैसे कि payload.hours स्तंभ में एक तत्व

पेलोड.hours ...

[530] "{\" सोमवार \ ": [[\" 10:30 \ ", \" 16:00 \ "]], \" मंगलवार \ ": [[\" 10:30 \ ", \" 16 : 00 \ "]], \" बुधवार \ ": [[\" 10:30 \ ", \" 16:00 \ "]], \" गुरुवार \ ": [[\" 10:30 \ ", \ "16:00 \"]], \ "शुक्रवार \": [[\ "10:30 \", \ "16:00 \"]], \ "शनिवार \": [[\ "10: 30 \" , \ "16:00 \"]], \ "रविवार \": [[\ "10:30 \", \ "16: 00 \"]]} "

यह वही है जो मैंने नेस्टेड सूचियों को "घंटे" कॉलम में खोलने के लिए उपयोग किया था ... लेकिन यह काम नहीं करता है ...

  library(ndjson)
  json<- ndjson::stream_in("#localpath")  
  #successfully converted json to a dataframe...but each element in payload.hours column remains nested like above.

  lapply(json$payload.hours, jsonlite::fromJSON)
  #continue unwarp nested jason column BUT RESULT  Error in if (is.character(txt) && length(txt) == 1 && nchar(txt, type = "bytes") <  :missing value where TRUE/FALSE needed

एक अन्य तरीका मैंने कोशिश की (एक लंबे समय के लिए) RegEx है

hrs<-json1$payload.hours         #select column hours into hrs
tme<-"sunday{1}.{8}[0-9]{1}\""   # ???(not sure about this...seruously)...?  match string with sunday and after 8characters..aka find preceding digit{1} when meet ":" 
iftme<-grepl(tme,hrs)            #set logical factor T/F if matches 
checkhrs<-hrs[iftme]             #check if open hours are correct
checkhrs

और यह काम करने लगता है ... लेकिन मुझे यकीन नहीं है कि क्यों ... (हाँ.आईडीके क्यों) ... तो अगर कोई मुझे समझा सके कि वह महान होगा!

यह मूल जेसन फाइल है:

https://drive.google.com/open?id=0B-jU6pp4pjS4Smg2RGpHSTlvN2c

यह RegEx उत्पादन है ... सही लगता है ... लेकिन मुझे मेरी अभिव्यक्ति के बारे में निश्चित नहीं है ..


Unpacking JSON बहुत काम हो सकता है, खासकर अगर यह गहराई से नेस्टेड हो। अधिकांश जेएसओएन पढ़ने वाले पैकेज ( jsonlite , RJSONIO , आदि।) डेटा को डेटा की सीमा के करीब कुछ में बदल सकते हैं, लेकिन संरचना को ठीक करने के लिए समझने की आवश्यकता है कि रीडर फ़ंक्शंस नहीं हैं। चूंकि JSON लगभग आर की सूचियों से मेल खाती है, JSON से आने वाले डेटा को साफ करने में आम तौर पर कई तरह के lapply और उसके भिन्न संस्करण शामिल होते हैं। यहाँ मैं purrr उपयोग purrr , जिसमें कई उपयोगी भिन्न रूप और सहायक फ़ंक्शन हैं और dplyr साथ बड़े करीने से dplyr

library(tidyverse)

# Read data
json <- jsonlite::stream_in(file('~/Downloads/jsondata.json'))

        # Initial cleanup to proper data.frame
json <- json$payload %>% map_df(simplify_all) %>% dmap(simplify) %>% 
    mutate(uuid = json$uuid,    # re-add uuid subset out at beginning
           # Convert hours to a list column of data.frames
           hours = hours %>% map_if(negate(is.na), jsonlite::fromJSON) %>%
               map(~map_df(.x, as_data_frame, .id = 'day')), 
           # Add Boolean variable for whether Sunday opening hours are before 10a. Subset,
           open_sun_before_10 = hours %>% map(~.x %>% filter(day == 'sunday') %>% .[[2]]) %>%
               map(as.POSIXct, format = '%H:%M') %>%    # convert to datetime,
               map(~.x < as.POSIXct('10:00', format = '%H:%M')) %>%    # compare to 10a
               map_lgl(~ifelse(length(.x) == 0, NA, .x)))    # and cleanup.

जबकि stream_in ने दो कॉलम (एक बहुत गहराई से नेस्टेड) ​​के साथ एक डेटा। stream_in वापस किया, कॉलम अब कम नेस्टेड हैं हालांकि, अब तक कुछ अछूते कॉलम में जेएसओएन संरचनाएं हैं, हालांकि, अगर आप डेटा का उपयोग करना चाहते हैं तो इसका समाधान करना होगा।

json
#> # A tibble: 538 × 42
#>    existence_full                               geo_virtual  latitude
#>             <dbl>                                     <chr>     <chr>
#> 1        1.000000 ["56.9459720|-2.1971226|20|within_50m|4"] 56.945972
#> 2        1.000000   ["56.237480|-5.073578|20|within_50m|4"] 56.237480
#> 3        1.000000     ["51.483872|-0.606820|100|rooftop|2"] 51.483872
#> 4        1.000000     ["57.343233|-2.191955|100|rooftop|4"] 57.343233
#> 5        1.000000   ["53.225815|-4.094775|20|within_50m|4"] 53.225815
#> 6        1.000000 ["58.9965740|-3.1882195|20|within_50m|4"] 58.996574
#> 7        1.000000     ["57.661419|-2.520144|100|rooftop|4"] 57.661419
#> 8        1.000000   ["51.642727|-3.934845|20|within_50m|4"] 51.642727
#> 9        0.908251                                      <NA>      <NA>
#> 10       1.000000     ["56.510558|-5.401638|100|rooftop|2"] 56.510558
#> # ... with 528 more rows, and 39 more variables: locality <chr>,
#> #   `_records_touched` <chr>, address <chr>, email <chr>,
#> #   existence_ml <dbl>, domain_aggregate <chr>, name <chr>,
#> #   search_tags <list>, admin_region <chr>, existence <dbl>,
#> #   category_labels <list>, post_town <chr>, region <chr>,
#> #   review_count <chr>, geocode_level <chr>, tel <chr>, placerank <int>,
#> #   longitude <chr>, placerank_ml <dbl>, fax <chr>,
#> #   category_ids_text_search <chr>, website <chr>, status <chr>,
#> #   geocode_confidence <chr>, postcode <chr>, category_ids <list>,
#> #   country <chr>, `_geocode_quality` <chr>, hours_display <chr>,
#> #   hours <list>, neighborhood <list>, languages <chr>,
#> #   address_extended <chr>, status_closed <chr>, po_box <chr>,
#> #   name_variants <list>, yext_id <chr>, uuid <chr>,
#> #   open_sun_before_10 <lgl>

और कॉलम बनाया:

json %>% select(hours, open_sun_before_10)
#> # A tibble: 538 × 2
#>               hours open_sun_before_10
#>              <list>              <lgl>
#> 1  <tibble [1 × 2]>                 NA
#> 2  <tibble [1 × 2]>                 NA
#> 3  <tibble [7 × 3]>              FALSE
#> 4  <tibble [1 × 2]>                 NA
#> 5  <tibble [7 × 3]>              FALSE
#> 6  <tibble [1 × 2]>                 NA
#> 7  <tibble [1 × 2]>                 NA
#> 8  <tibble [6 × 3]>                 NA
#> 9  <tibble [1 × 2]>                 NA
#> 10 <tibble [7 × 3]>               TRUE
#> # ... with 528 more rows




nested