2016-09-06 6 views
2

У меня есть вектор JSONs (той же структуры) и преобразуйте его в data.frame. Следующий пример делает именно то, что я хочу.R: Вектор JSONs для data.frame

require(jsonlite) # fromJSON() 
require(magrittr) # for the pipeline only 
require(data.table) # rbindlist() 

jsons <- c('{"num":1,"char":"a","list":{"x":1,"y":2}}', 
      '{"num":2,"char":"b","list":{"x":1,"y":2}}', 
      '{"num":3,"char":"c","list":{"x":1,"y":2}}') 

df <- jsons %>% 
    lapply(fromJSON) %>% 
    lapply(as.data.frame.list, stringsAsFactors = F) %>% 
    rbindlist(fill = T) 

Некоторые элементы JSON являются объектами, то есть, если я преобразовать его fromJSON() некоторые элементы списка будут перечислены также. Я не могу использовать unlist() для каждого списка, потому что у меня разные типы переменных, поэтому я использую функцию as.data.frame.list(). Это, однако, слишком медленно для каждого JSON в отдельности. Есть ли способ, как я могу сделать это более эффективно?

json <- '{"$schema":"http://json-schema.org/draft-04/schema#","title":"Product set","type":"array","items":{"title":"Product","type":"object","properties":{"id":{"description":"The unique identifier for a product","type":"number"},"name":{"type":"string"},"price":{"type":"number","minimum":0,"exclusiveMinimum":true},"tags":{"type":"array","items":{"type":"string"},"minItems":1,"uniqueItems":true},"dimensions":{"type":"object","properties":{"length":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["length","width","height"]},"warehouseLocation":{"description":"Coordinates of the warehouse with the product","$ref":"http://json-schema.org/geo"}},"required":["id","name","price"]}}' 
system.time(
    df <- json %>% rep(1000) %>% 
    lapply(fromJSON) %>% 
    lapply(as.data.frame.list, stringsAsFactors = F) %>% 
    rbindlist(fill = T) 
) # 2.72 

Я знаю, что есть много подобных вопросов, но большинство ответов я видел, был об использовании as.data.frame() или data.frame(). Никто не упомянул скорость. Может быть, нет лучшего решения этого.

ответ

1

Наконец-то я нашел answer. Это будет на CRAN soon.

devtools::install_github("jeremystan/tidyjson") 
tidyjson::spread_all() 

Эта функция примерно в 10 раз быстрее, чем мой пример выше.

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