2016-10-24 4 views
2

У меня есть столбец, который содержит данные в формате JSON, как в следующем примере,Преобразовать таблицу R данные столбец из JSON в таблицу данных

library(data.table) 
test <- data.table(a = list(1,2,3), 
      info = list("{'duration': '10', 'country': 'US'}", 
         "{'duration': '20', 'country': 'US'}", 
         "{'duration': '30', 'country': 'GB', 'width': '20'}")) 

Я хочу, чтобы преобразовать последнюю колонку в эквивалентные хранения R, который будет выглядеть примерно так до,

res <- data.table(a = list(1, 2, 3), 
        duration = list(10, 20, 30), 
        country = list('US', 'US', 'GB'), 
        width = list(NA, NA, 20)) 

Поскольку у меня есть 500K строк с различным содержанием, я бы поискал быстрый способ сделать это.

+1

Хорошо, не стесняйтесь редактировать, если вы знаете, как исправить его каким-то образом, что не нарушит ответ. – Frank

ответ

3

вариации без необходимости выделить строку JSON

library(data.table) 
library(jsonlite) 

test[, info := gsub("'", "\"", info)] 
test[, rbindlist(lapply(info, fromJSON), use.names = TRUE, fill = TRUE)] 

# duration country width 
# 1:  10  US NA 
# 2:  20  US NA 
# 3:  30  GB 20 
+0

приятное решение таблицы данных! Именно то, что я искал. – Stereo

3

Разбираем JSON, а затем построить data.frame (или data.table):

json_string <- paste(c("[{'duration': '10', 'country': 'US'}", 
    "{'duration': '20', 'country': 'US'}", 
    "{'duration': '30', 'country': 'GB'}", 
    "{'width': '20'}]"), collapse=", ") 

# JSON standard requires double quotes 
json_string <- gsub("'", "\"", json_string) 

library("jsonlite") 
fromJSON(json_string) 

# duration country width 
# 1  10  US <NA> 
# 2  20  US <NA> 
# 3  30  GB <NA> 
# 4  <NA> <NA> 20 

Это не совсем то, что вы просили, как ваш JSON не связывает «ширина» с предыдущий рекорд, вам, возможно, придется сделать некоторые манипуляции с первыми:

json_string <- paste(c("[{'duration': '10', 'country': 'US'}", 
    "{'duration': '20', 'country': 'US'}", 
    "{'duration': '30', 'country': 'GB', 'width': '20'}]"), 
    collapse=", ") 

json_string <- gsub("'", "\"", json_string) 
df <- jsonlite::fromJSON(json_string) 
data.table::as.data.table(df) 

# duration country width 
# 1:  10  US NA 
# 2:  20  US NA 
# 3:  30  GB 20 
+1

рассмотрите использование 'setDT (df)' вместо 'data.table :: as.data.table (df)' – SymbolixAU

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