2016-05-13 3 views
0

У меня есть JSON-файл с событиями и журналами внутри этих событий, пример выглядит следующим образом:Как разобрать конкретные объекты в R?

{ 
    "sessionEvents": [ 
    { 
     "u": "BC0F6A3A2840B6F48386BABC5F34B480BA4F9929", 
     "v": "0.1.0", 
     "dv": "Unidentified", 
     "t": 1462924115818, 
     "uid": "", 
     "len": 148012, 
     "by": 0, 
     "g": "U", 
     "cy": "PH", 
     "cr": "Unknown", 
     "dm": "O+ Xfinit", 
     "lat": 0.0, 
     "lon": 0.0, 
     "l": [ 
     { 
      "e": "100_SESSION_START", 
      "o": 24, 
      "d": 147988, 
      "p": { 
      "User_Timezone": "-08:00", 
      "Session_nb": "0", 
      "Energy_Balance": "89", 
      "Global_Playtime": "0", 
      "Device_id": "75e64b654c01949", 
      "Game_Language": "en", 
      "Connection_Type": "WIFI", 
      "User_Country": "US", 
      "Push_Impact": "None" 
      } 
     }, 
     { 
      "e": "008_TUTORIAL_STEP_OTHER", 
      "o": 7561, 
      "d": 0, 
      "p": { 
      "Screen_id": "scene_screen", 
      "Misclicks": "0", 
      "Tutorial_Step": "19", 
      "Average_Time_Per_Frame": "0", 
      "Total_Time": "0" 
      } 
     } 
     ] 
    }, 
    { 
     "u": "C950FC733D883E11E36E15A705E05A3CC7748C3A", 
     "v": "0.1.0", 
     "dv": "OPPO Mirror 5", 
     "t": 1462908916463, 
     "uid": "", 
     "len": 5368, 
     "by": 0, 
     "g": "U", 
     "cy": "PH", 
     "cr": "Unknown", 
     "dm": "A51w", 
     "lat": 0.0, 
     "lon": 0.0, 
     "l": [ 
     { 
      "e": "100_SESSION_START", 
      "o": 169, 
      "d": 5199, 
      "p": { 
      "User_Timezone": "-08:00", 
      "Session_nb": "0", 
      "Energy_Balance": "0", 
      "Global_Playtime": "0", 
      "Device_id": "d0de71513e48fba", 
      "Game_Language": "en", 
      "Connection_Type": "WIFI", 
      "User_Country": "US", 
      "Push_Impact": "None" 
      } 
     } 
     ] 
    } 
    ] 
} 

Как вы можете видеть, есть второй объект уровня «л» с бревнами мероприятия и третьего уровня " p "с параметрами, и это дает мне боль. Я пытаюсь преобразовать его в фрейм данных, но мне нужны только значения журналов «100_SESSION_START» в таблице (все имена параметров имен «l» и «p» для него одинаковы), плюс, мне нужно добавить все параметры от объекта более высокого уровня - события ('u', 'v', 'dv', 't' ...). Кто-нибудь знает, как это сделать?

UPD: в результате было бы е приятно иметь таблицу как этот click

+0

Можете привести пример ожидаемого результата? – Psidom

+0

Возможный дубликат [Parse JSON with R] (http://stackoverflow.com/questions/2061897/parse-json-with-r) – theArun

+0

@Psidom обновил сообщение –

ответ

1

Предполагая, что вы загрузили файл json в data переменной

data <- fromJSON("/home/joel/tmp/input.json") 

, то вы можете перемещаться по каждому событию и в каждом журнале событий по мере необходимости:

n<-length(data$sessionEvents$u) 
for (i in 1:n) { # Iterate over events 
    print(data$sessionEvents$u[i]) 
    print(data$sessionEvents$v[i]) 
    print(data$sessionEvents$dv[i]) 
    print(data$sessionEvents$t[i]) 
    m<-length(data$sessionEvents$l[i][[1]]$e) 
    for(j in 1:m){ # Iterate over logs 
    print(data$sessionEvents$l[i][[1]]$e[j]) 
    } 
} 

Надеюсь, что это поможет.

+0

Да, можете ли вы привести пример такой итерации? :) –

+0

Я только что напечатал значения, сделай все, что хочешь. – joel314

+0

О, спасибо, я попробую! –

0

Вы можете сделать что-то подобное, используя lapply.

topLevel <- c("u", "v", "dv", "t") 
midLevel <- c("e", "o", "d") 
botLevel <- c("User_Timezone", "Session_nb", "Energy_Balance", "Global_Playtime") 

do.call(rbind, lapply(li[[1]], function(x) { 
    do.call(rbind, lapply(x$l, function(y) { 
     if(y$e == "100_SESSION_START") { 
      c(y[midLevel], y$p[botLevel], x[topLevel]) 
     } 
    })) 
})) 

    e     o d  User_Timezone Session_nb Energy_Balance Global_Playtime 
[1,] "100_SESSION_START" 24 147988 "-08:00"  "0"  "89"   "0"    
[2,] "100_SESSION_START" 169 5199 "-08:00"  "0"  "0"   "0"    
    u           v  dv    t   
[1,] "BC0F6A3A2840B6F48386BABC5F34B480BA4F9929" "0.1.0" "Unidentified" 1.462924e+12 
[2,] "C950FC733D883E11E36E15A705E05A3CC7748C3A" "0.1.0" "OPPO Mirror 5" 1.462909e+12 
+0

спасибо за ваш ответ! Я попытался запустить его, но имеет ошибку «Ошибка в y $ e: $ operator недопустима для атомных векторов», почему это может случиться? Im легко получить значение с такой командой «doc $ sessionEvents $ l [i] [[1]] $ p $ User_Timezone [[1]] ' –

+0

Я не совсем уверен. Буквально это означает, что 'y', который должен быть списком, является вектором здесь. И возможно, что ваши фактические данные имеют некоторые элементы, в которых элемент 'l' пуст. – Psidom

+0

Вы использовали «fromJSON», чтобы прочитать файл? –

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