2013-06-05 13 views
28

私は、Rで動作させたい1500個以上のjsonオブジェクトを含むファイルを持っています。リストとしてデータをインポートすることはできましたが、有用な構造。私は各jsonオブジェクトの行と各キー:列の列を含むデータフレームを作成したいと思います。インポートされたjsonデータをデータフレームに取得する

私はこの小さな、偽のデータセットとの私の状況を再現しました:データの

[{"name":"Doe, John","group":"Red","age (y)":24,"height (cm)":182,"wieght (kg)":74.8,"score":null}, 
{"name":"Doe, Jane","group":"Green","age (y)":30,"height (cm)":170,"wieght (kg)":70.1,"score":500}, 
{"name":"Smith, Joan","group":"Yellow","age (y)":41,"height (cm)":169,"wieght (kg)":60,"score":null}, 
{"name":"Brown, Sam","group":"Green","age (y)":22,"height (cm)":183,"wieght (kg)":75,"score":865}, 
{"name":"Jones, Larry","group":"Green","age (y)":31,"height (cm)":178,"wieght (kg)":83.9,"score":221}, 
{"name":"Murray, Seth","group":"Red","age (y)":35,"height (cm)":172,"wieght (kg)":76.2,"score":413}, 
{"name":"Doe, Jane","group":"Yellow","age (y)":22,"height (cm)":164,"wieght (kg)":68,"score":902}] 

一部の機能:すべてのキーの同じ番号が含ま

  • オブジェクト:valueのペアが、 一部の値はnullです
  • オブジェクト(名前とグループ)あたり2つの非数値列があります(名前とグループ)
  • 名前は一意のIDですいろいろなグループがあります。
  • 名前とグループのエンティティには、スペース、カンマおよびその他の句読点が含まれています。この質問に基づいて

R list(structure(list())) to data frame、私は次のことを試してみました:

json_file <- "test.json" 
json_data <- fromJSON(json_file) 
asFrame <- do.call("rbind.fill", lapply(json_data, as.data.frame)) 

私の実際のデータと、この偽のデータの両方を使用すると、最後の行は、私は、このエラーを与える:

Error in data.frame(name = "Doe, John", group = "Red", `age (y)` = 24, : 
    arguments imply differing number of rows: 1, 0 

答えて

38

NULLをNAsに置き換えるだけでいいです:

require(RJSONIO)  

json_file <- '[{"name":"Doe, John","group":"Red","age (y)":24,"height (cm)":182,"wieght (kg)":74.8,"score":null}, 
    {"name":"Doe, Jane","group":"Green","age (y)":30,"height (cm)":170,"wieght (kg)":70.1,"score":500}, 
    {"name":"Smith, Joan","group":"Yellow","age (y)":41,"height (cm)":169,"wieght (kg)":60,"score":null}, 
    {"name":"Brown, Sam","group":"Green","age (y)":22,"height (cm)":183,"wieght (kg)":75,"score":865}, 
    {"name":"Jones, Larry","group":"Green","age (y)":31,"height (cm)":178,"wieght (kg)":83.9,"score":221}, 
    {"name":"Murray, Seth","group":"Red","age (y)":35,"height (cm)":172,"wieght (kg)":76.2,"score":413}, 
    {"name":"Doe, Jane","group":"Yellow","age (y)":22,"height (cm)":164,"wieght (kg)":68,"score":902}]' 


json_file <- fromJSON(json_file) 

json_file <- lapply(json_file, function(x) { 
    x[sapply(x, is.null)] <- NA 
    unlist(x) 
}) 
do.call("rbind", json_file) 
    name   group age (y) height (cm) wieght (kg) score 
[1,] "Doe, John" "Red" "24" "182"  "74.8"  NA 
[2,] "Doe, Jane" "Green" "30" "170"  "70.1"  "500" 
[3,] "Smith, Joan" "Yellow" "41" "169"  "60"  NA 
[4,] "Brown, Sam" "Green" "22" "183"  "75"  "865" 
[5,] "Jones, Larry" "Green" "31" "178"  "83.9"  "221" 
[6,] "Murray, Seth" "Red" "35" "172"  "76.2"  "413" 
[7,] "Doe, Jane" "Yellow" "22" "164"  "68"  "902" 
+3

にJSONデータをロードするために、これを試してください。 (XMLのためにXMLtoDataFrameのような関数があるので)JSONtoDataFrameは素晴らしいでしょう。 – userJT

+1

@userJT - 'jsonlite :: fromJSON'があります - NULLを処理し、' data.frame'に単純化します。 [私の答え](http://stackoverflow.com/a/37739735/5977215) – SymbolixAU

+0

これはjson_fileをデータフレームではなく行列に変換します。 data.frameを取得するにはどうすればいいですか? – TSR

-2

はNULL値があることwon't

json_data <- fromJSON(json_file, nullValue = NA) 
asFrame <- do.call("rbind.fill", lapply(json_data, as.data.frame)) 

この方法は、パラメータNULLVALUEを使用して削除するには:あなたは、各要素に対してnull以外の値を持ってたら、あなたがエラーを取得せずにrbindを呼び出すことができますあなたはlibrary(jsonlite)と機能fromJSONを使用する場合は、あなたの出力

2
dplyr::bind_rows(fromJSON(file_name)) 
+0

'fromJson'関数を使っていますか? 'jsonlite'のものであれば' dplyr :: bind_rows'は冗長です。 'rjson'からのものであれば、あなたのsolutinoは提供されたデータに誤りがあります。 – SymbolixAU

+0

覚えていない。ものが変更されている必要があります –

15

で不要な引用符は、これは非常に簡単です。また、nullの値を処理し、NAに変換します。

json_file <- '[{"name":"Doe, John","group":"Red","age (y)":24,"height (cm)":182,"wieght (kg)":74.8,"score":null}, 
    {"name":"Doe, Jane","group":"Green","age (y)":30,"height (cm)":170,"wieght (kg)":70.1,"score":500}, 
{"name":"Smith, Joan","group":"Yellow","age (y)":41,"height (cm)":169,"wieght (kg)":60,"score":null}, 
{"name":"Brown, Sam","group":"Green","age (y)":22,"height (cm)":183,"wieght (kg)":75,"score":865}, 
{"name":"Jones, Larry","group":"Green","age (y)":31,"height (cm)":178,"wieght (kg)":83.9,"score":221}, 
{"name":"Murray, Seth","group":"Red","age (y)":35,"height (cm)":172,"wieght (kg)":76.2,"score":413}, 
{"name":"Doe, Jane","group":"Yellow","age (y)":22,"height (cm)":164,"wieght (kg)":68,"score":902}]' 

library(jsonlite) 
fromJSON(json_file) 
#   name group age (y) height (cm) wieght (kg) score 
# 1 Doe, John Red  24   182  74.8 NA 
# 2 Doe, Jane Green  30   170  70.1 500 
# 3 Smith, Joan Yellow  41   169  60.0 NA 
# 4 Brown, Sam Green  22   183  75.0 865 
# 5 Jones, Larry Green  31   178  83.9 221 
# 6 Murray, Seth Red  35   172  76.2 413 
# 7 Doe, Jane Yellow  22   164  68.0 902 

str(fromJSON(json_file)) 
# 'data.frame': 7 obs. of 6 variables: 
# $ name  : chr "Doe, John" "Doe, Jane" "Smith, Joan" "Brown, Sam" ... 
# $ group  : chr "Red" "Green" "Yellow" "Green" ... 
# $ age (y) : int 24 30 41 22 31 35 22 
# $ height (cm): int 182 170 169 183 178 172 164 
# $ wieght (kg): num 74.8 70.1 60 75 83.9 76.2 68 
# $ score  : int NA 500 NA 865 221 413 902 
+0

私はあなたとまったく同じコードを実行しましたが、 'fromJSON'を実行すると、データフレームではなくリストが返されます。どのようにデータフレームを返すようにしましたか? – Alexander

+0

@Alexander - 私はまだ 'data.frame'を取得します。 'jsonlite :: fromJSON'を使っていることを確認してください – SymbolixAU

3
library(rjson) 
Lines <- readLines("yelp_academic_dataset_business.json") 
business <- as.data.frame(t(sapply(Lines, fromJSON))) 

あなたは、私がこれを行うには良い機能が存在しないことに驚いR

関連する問題