2014-12-11 42 views
5

Tôi gặp sự cố với JSON lồng nhau rất khó chịu.Phân tích cú pháp lồng nhau JSON vào Khung dữ liệu trong R

Cấu trúc của nó như thế này

{ 
    "matches": [ 
    { 
     "matchId": 1, 
     "region": "BR", 
     "participants": [ 
     { 
      "participantId": 0, 
      "teamId": 200, 
     "stats": { 
      "winner": true, 
      "champLevel": 16, 
      "item0": 3128, 
      } 
     { 
     "matchId": 2, 
     "region": "BR", 
     "participants": [ 
     { 
      "participantId": 0, 
      "teamId": 201, 
     "stats": { 
      "winner": false, 
      "champLevel": 18, 
      "item0": 3128, 
      "item1": 3157, 
      "item1": 3158, 
      } 

Như bạn có thể thấy trong trận đấu thứ hai số lượng các mặt hàng tăng, nhưng trong khung dữ liệu hàng đầu tiên sẽ có cơ collumns cùng:

MatchId region ... stats.winner stats.champLevel stats.item0 stats.item1 stats.item2 
1   BR   TRUE   16     3128   1  BR 
1   BR   TRUE   16     3128   3157  3158 

Xem hàng đầu tiên nhỏ hơn số thứ hai, vì vậy R tái chế các giá trị ....

Nếu bạn muốn có đầy đủ dữ liệu bạn có thể lấy tại: http://pastebin.com/HQDf2ase

Làm thế nào tôi phân tích các json để data.frame:

ngừng công bố các yếu tố của Json và chuyển nó sang một khung dữ liệu

matchData.i <- lapply(json.matchData$matches, function(x){ unlist(x)}) 

Chuyển đổi thành dữ liệu Khung

matchData <- do.call("rbind", matchData.i) 
matchData <- as.data.frame(matchData) 

Nhưng khung dữ liệu bị sai lệch, vì một số trường phải là NA nhưng chúng được điền bằng wron g giá trị.

Trả lời

4

Tôi nghĩ rằng việc sử dụng chức năng plyrrbind.fill() sẽ hữu ích ở đây. Làm thế nào về vấn đề này

library(plyr) 
matchData <- rbind.fill(lapply(matchData.i, 
    function(x) do.call("data.frame", as.list(x)) 
)) 

bit lapply() là để biến danh sách trung vào data.frames mà rbind.fill yêu cầu.

Các vấn đề liên quan