2017-04-22 73 views
0

我有一个超过100,000个json文件的列表,我想从中获取data.table只有几个变量。不幸的是这些文件很复杂。每个JSON文件的内容是这样的:从json文件列表到data.table:部分变量列表

样品1

$id 
[1] "10.1" 
$title 
$title$value 
[1] "Why this item" 
$itemsource 
$itemsource$id 
[1] "AA" 
$date 
[1] "1992-01-01" 
$itemType 
[1] "art" 
$creators 
list() 

样品2

$id 
[1] "10.2" 
$title 
$title$value 
[1] "We need this item" 
$itemsource 
$itemsource$id 
[1] "AY" 
$date 
[1] "1999-01-01" 
$itemType 
[1] "art" 
$creators 
    type    name firstname surname affiliationIds 
1 Person Frank W. Cornell. Frank W. Cornell.    a1 
2 Person David A. Chen. David A. Chen.    a1 

$affiliations 
    id           name 
1 a1 Foreign Affairs Desk, New York Times 

我从这组文件需要与制作者姓名,项目ID和日期表。对于上述两个示例文件:

id   date   name    firstname lastname creatortype 
"10.1"  "1992-01-01"  NA     NA  NA  NA 
"10.2"  "1999-01-01" Frank W. Cornell.  Frank W. Cornell. Person 
"10.2"  "1999-01-01" David A. Chen.   David A. Chen.  Person 

我迄今所做的:

library(parallel) 
library(data.table) 
library(jsonlite) 
library(dplyr) 

filelist = list.files(pattern="*.json",recursive=TRUE,include.dirs =TRUE) 
parsed = mclapply(filelist, function(x) fromJSON(x),mc.cores=24) 
data = rbindlist(mclapply(1:length(parsed), function(x) { 
    a = data.table(item = parsed[[x]]$id, date = list(list(parsed[[x]]$date)), name = list(list(parsed[[x]]$name)), creatortype = list(list(parsed[[x]]$creatortype))) #ignoring the firstname/lastname fields here for convenience 
    b = data.table(id = a$item, date = unlist(a$date), name=unlist(a$name), creatortype=unlist(a$creatortype)) 
    return(b) 
},mc.cores=24)) 

然而,在最后一步,我得到这个错误:

"Error in rbindlist(mclapply(1:length(parsed), function(x){: 
Item 1 of list is not a data.frame, data.table or list" 

在此先感谢为您的建议。 相关的问题包括: Extract data from list of lists [R] R convert json to list to data.table I want to convert JSON file into data.table in r How can read files from directory using R? Convert R data table column from JSON to data table

回答

1

从该错误消息,我想这基本上意味着,从mclapply结果之一()是空的,由空我的意思是NULL或数据。表中有0行,或者只是在并行处理中遇到错误。

你可以做的是:

  1. 添加更多的检查mclapply内()之类的尝试 - 错误或检查B类B和nrow的,B是否为空或不

  2. 当你使用rbindlist,添加参数填充= T

希望这可以解决你的问题。