2016-05-26 4 views
0

У меня есть простой JSON-файл, который я пытаюсь принудить в R data.frame.Простое форматирование с tidyjson с R

json = " 
{ \"objects\": 
    { 
    \"object_one\": { 
     \"key1\"  : \"value1\", 
     \"key2\"  : \"value2\", 
     \"key3\"  : \"0\", 
     \"key4\"  : \"value3\", 
     \"key5\"  : \"False\", 
     \"key6\"  : \"False\" 
    }, 

    \"object_two\": { 
     \"key1\"  : \"0.5\", 
     \"key2\"  : \"0\", 
     \"key3\"  : \"343\", 
     \"key4\"  : \"value4\", 
     \"key5\"  : \"True\", 
     \"key6\"  : \"True\" 
    } 
    } 
} 
" 

, и я просто хочу, чтобы извлечь имя каждого объекта в качестве ключа индекса (или rowname), создавать имена столбцов из ключей и распространения значения.

К сожалению, мне не повезло, установив синтаксис. Может ли кто-нибудь помочь?

Благодаря

Стюарт

ответ

1

Не совсем уверен, что на вашем желаемый результат, но вы можете использовать jsonlite::fromJSON для извлечения данных, и data.table::rbindlist положить его в data.table

library(jsonlite) 
library(data.table) 

rbindlist(fromJSON(json)) 

#  object_one object_two 
# 1:  value1  0.5 
# 2:  value2   0 
# 3:   0  343 
# 4:  value3  value4 
# 5:  False  True 
# 6:  False  True 

На основе вашего комментария, другой подход, который включает в себя некоторые изменения формы

library(jsonlite) 
library(reshape2) 

lst <- fromJSON(json) 
lst <- lapply(lst[[1]], unlist) 

df <- as.data.frame(lst) 
df$key <- rownames(df) 

df <- melt(df, id = "key") 
df <- dcast(df, formula = variable ~ key) 
df 
#  variable key1 key2 key3 key4 key5 key6 
# 1 object_one value1 value2 0 value3 False False 
# 2 object_two 0.5  0 343 value4 True True 
+0

В идеале я хочу, чтобы формат был фреймом данных с colnames = c («key1», «key2», «keyn» ...) и именами ростов для c («object_one», «object_two») и т. Д. – stu

+0

@ stu - см. мое редактирование. – SymbolixAU

+0

Прохладный спасибо @symbolix. Спасибо за помощь! – stu

2

Есть два способа сделать это с tidyjson, во-первых, использовать tidyjson::append_values_string, а затем tidyr::spread:

library(tidyjson) 
library(dplyr) 
library(tidyr) 
json %>% 
    enter_object("objects") %>% 
    gather_keys("object") %>% 
    gather_keys("key") %>% 
    append_values_string("value") %>% 
    tbl_df %>% spread(key, value) 

#> # A tibble: 2 x 8 
#> document.id  object key1 key2 key3 key4 key5 key6 
#> *  <int>  <chr> <chr> <chr> <chr> <chr> <chr> <chr> 
#> 1   1 object_one value1 value2  0 value3 False False 
#> 2   1 object_two 0.5  0 343 value4 True True  

Другой способ заключается в использовании tidyjson::spread_values к конкретным каждый ключ по отдельности:

json %>% 
    enter_object("objects") %>% 
    gather_keys("object") %>% 
    spread_values(
    key1 = jstring("key1"), 
    key2 = jstring("key2"), 
    key3 = jnumber("key3"), 
    key4 = jstring("key4"), 
    key5 = jstring("key5"), 
    key6 = jstring("key6") 
) 

#> document.id  object key1 key2 key3 key4 key5 key6 
#> 1   1 object_one value1 value2 0 value3 False False 
#> 2   1 object_two 0.5  0 343 value4 True True 

Преимущество второго подхода заключается в том, что вы можете (a) указать типы каждого столбца и (b) гарантировать, что они получат одну и ту же структуру data.frame, даже если ключи изменяются (или отсутствуют) в некоторых документов или объектов.

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

  • Нет связанных вопросов^_^