2016-10-24 107 views
2

我有我想要的最后一列转换为对应的[R存储,这将类似于包含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'}")) 

到,

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