2016-07-17 12 views
0

私はYelpデータセットで遊んでいて、そのカテゴリに応じてビジネスセットをフィルタリングしたいと考えています。ネストされたデータフレーム内のフィルタ

私は、次のデータフレームに、結果

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

とRへの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を使うことはカテゴリがリストであり、メインのデータフレーム内のデータフレームではないので、どちらも役に立ちません。

これを解決する方法はありますか?私はちょうどすべての食品レストランのビジネスidsのリストを必要とし、Yelpからレビューjsonファイルをフィルタリングして、書面によるレビューを抽出する必要があります。

本当にありがとうございます!どうもありがとう!

+0

yelp_business $ categories < - unlist(yelp_business $ categories) ' –

+0

ありがとうPierre、私もこれを試しましたが、カテゴリの各行に異なる数のカテゴリタグがあるという問題があります。 ($ tmp * '、" categories "、value = c(" $ tmp * "、" $ tmp * ")のエラーは次のエラーメッセージを表示するために必要な77445行の代わりに227451個の新しい行を生成します: 'ファーストフード "、: の置換行は227451行、データは77445である – rkuebler

+0

これは問題ではありません、' grepl( "a"、list(c、 "a"、 "b")、 "c"問題は上記のネストされたデータフレームです –

答えて

0

tidyjsonはないyetサポートndjsonを行い、そして私はうまくstream_in()で動作するかどうかはかなりわかりません。

ただし、ファイルを直接読み取ってtidyjsonで自然に処理することは可能です。私はdevtools::install_github('jeremystan/tidyjson')から開発版を使用しています。

document.idはオブジェクトの素性がわかりやすいので、「カテゴリ」の1つに「フード」を持つ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> 

注 - yelp_academic_dataset_business.jsonファイルの最初の100レコードしか処理しませんでした。

関連する問題