2016-07-17 2 views
0

Я играю с набором данных Yelp и хочу отфильтровать бизнес-набор в соответствии с категорией.Фильтр в вложенных кадрах данных

Я импортировал файл JSON в R с

yelp_business = stream_in(file("yelp_academic_dataset_business.json")) 

что приводит затем в следующем кадре данных:

'data.frame': 77445 obs. of 15 variables: 
$ business_id : chr "5UmKMjUEUNdYWqANhGckJw" "UsFtqoBl7naz8AVUBZMjQQ" "3eu6MEFlq2Dg7bQh8QbdOg" "cE27W9VPgO88Qxe4ol6y_g" ... 
$ full_address : chr "4734 Lebanon Church Rd\nDravosburg, PA 15034" "202 McClure St\nDravosburg, PA 15034" "1 Ravine St\nDravosburg, PA 15034" "1530 Hamilton Rd\nBethel Park, PA 15234" ... 
$ hours  :'data.frame': 77445 obs. of 7 variables: 
    ..$ Friday :'data.frame': 77445 obs. of 2 variables: 
    .. ..$ close: chr "21:00" NA NA NA ... 
    .. ..$ open : chr "11:00" NA NA NA ... 
    ..$ Tuesday :'data.frame': 77445 obs. of 2 variables: 
    .. ..$ close: chr "21:00" NA NA NA ... 
    .. ..$ open : chr "11:00" NA NA NA ... 
    ..$ Thursday :'data.frame': 77445 obs. of 2 variables: 
    .. ..$ close: chr "21:00" NA NA NA ... 
    .. ..$ open : chr "11:00" NA NA NA ... 
    ..$ Wednesday:'data.frame': 77445 obs. of 2 variables: 
    .. ..$ close: chr "21:00" NA NA NA ... 
    .. ..$ open : chr "11:00" NA NA NA ... 
    ..$ Monday :'data.frame': 77445 obs. of 2 variables: 
    .. ..$ close: chr "21:00" NA NA NA ... 
    .. ..$ open : chr "11:00" NA NA NA ... 
    ..$ Sunday :'data.frame': 77445 obs. of 2 variables: 
    .. ..$ close: chr NA NA NA NA ... 
    .. ..$ open : chr NA NA NA NA ... 
    ..$ Saturday :'data.frame': 77445 obs. of 2 variables: 
    .. ..$ close: chr NA NA NA NA ... 
    .. ..$ open : chr NA NA NA NA ... 
$ open   : logi TRUE TRUE TRUE FALSE TRUE TRUE ... 
$ categories :List of 77445 
    ..$ : chr "Fast Food" "Restaurants" 
    ..$ : chr "Nightlife" 
    ..$ : chr "Auto Repair" "Automotive" 
    ..$ : chr "Active Life" "Mini Golf" "Golf" 
    ..$ : chr "Shopping" "Home Services" "Internet Service Providers" "Mobile Phones" ... 
    ..$ : chr "Bars" "American (New)" "Nightlife" "Lounges" ... 
    ..$ : chr "Active Life" "Trainers" "Fitness & Instruction" 
    ..$ : chr "Bars" "American (Traditional)" "Nightlife" "Restaurants" 
    ..$ : chr "Auto Repair" "Automotive" "Tires" 
    ..$ : chr "Active Life" "Mini Golf" 
    ..$ : chr "Home Services" "Contractors" 
    ..$ : chr "Veterinarians" "Pets" 
    ..$ : chr "Libraries" "Public Services & Government" 
    ..$ : chr "Automotive" "Auto Parts & Supplies" 

Теперь я хочу, чтобы отфильтровать все строки в соответствии с бизнес-категории и хотите включают все категории, в которых есть еда в списке категорий.

Однако, если я просто пытаюсь это таким образом:

input ="food" 
engage = filter(yelp_business, grepl(input, categories)) 

я получаю следующий код ошибки:

Error: data_frames can only contain 1d atomic vectors and lists 

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

У кого-нибудь есть идея, как это решить? Мне просто нужен список всех идентификаторов бизнеса в ресторане, чтобы затем отфильтровать обзорный файл json от Yelp, чтобы извлечь письменные отзывы.

Любая помощь с этим действительно оценена! Большое спасибо!

+0

попробуйте 'yelp_business $ categories <- unlist (yelp_business $ categories)' –

+0

Спасибо Пьер, я тоже это пробовал, но проблема в том, что каждая строка в категориях имеет различное количество тегов категории. Отметьте результаты в 227451 новых строках вместо необходимых строк 77445, чтобы получить следующее сообщение об ошибке: 'Ошибка в' $ <-. Data.frame' ('* tmp *', "categories", value = c (" Fast Food ",: Замена имеет 227451 строк, данные имеют 77445' – rkuebler

+0

Это не проблема. См.' Grepl («a», список (c («a», «b»), «c»)) ' Проблема заключается в вложенных фреймах данных выше. –

ответ

0

tidyjson не yet поддержка ndjson, и я не совсем уверен, как красиво работать с stream_in().

Однако, можно напрямую прочитать файл и обработать его с помощью tidyjson. Я использую версию разработки от devtools::install_github('jeremystan/tidyjson').

document.id дает хорошую идентификацию объектов, поэтому я нахожу document.id, у которых есть «еда» в одной из «категорий». С этого момента мы фильтруем и делаем все, что требуется для дополнительного анализа данных.

library(dplyr) 
library(stringr) 
library(tidyjson) 

j <- readLines("yelp_academic_dataset_business.json") 

raw <- j %>% as.tbl_json() 

## pull out the categories for filtering 
prep <- raw %>% enter_object("categories") %>% 
    gather_array() %>% append_values_string() 

## filter to 'food' categories (use document.id to identify json objects) 
keepids <- prep[str_detect(str_to_lower(prep$string), "food"), ]$document.id %>% 
    unique() 

## filter and do any further data analysis you want to do 
raw %>% filter(document.id %in% keepids) %>% 
spread_values(
    name = json_chr(name), 
    city = json_chr(city), 
    state = json_chr(state), 
    stars = json_chr(stars)) 
#> # A tbl_json: 21 x 5 tibble with a "JSON" attribute 
#>   `attr(., "JSON")` document.id      name  city 
#>      <chr>  <int>      <chr>  <chr> 
#> 1 "{\"business_id\":..."   2    Cut and Taste Las Vegas 
#> 2 "{\"business_id\":..."   8     Taco Bell Scottsdale 
#> 3 "{\"business_id\":..."   10   Sehne Backwaren Stuttgart 
#> 4 "{\"business_id\":..."   20 Graceful Cake Creations  Mesa 
#> 5 "{\"business_id\":..."   26 Chipotle Mexican Grill Toronto 
#> 6 "{\"business_id\":..."   30 Carrabba's Italian Grill Glendale 
#> 7 "{\"business_id\":..."   32    I Deal Coffee Toronto 
#> 8 "{\"business_id\":..."   34 Lo-Lo's Chicken & Waffles Phoenix 
#> 9 "{\"business_id\":..."   38    Kabob Palace Las Vegas 
#> 10 "{\"business_id\":..."   43    Tea Shop 168 Markham 
#> # ... with 11 more rows, and 2 more variables: state <chr>, stars <chr> 

Примечание - Я обработали только первые 100 записей файла yelp_academic_dataset_business.json.

Смежные вопросы