2016-10-24 3 views
2

私は、次の例のようにJSONデータを含む列、変換Rデータテーブルのカラム

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

data.frame(またはdata.table)を構築、その後、最初のJSONをパース:

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

'data.table :: as.data.table(df)'の代わりに 'setDT(df)'を使うことを考えてください。 – SymbolixAU

関連する問題