Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 使用R从json文件构建数据帧时,merge()的有效替代方案?_Performance_Json_R - Fatal编程技术网

Performance 使用R从json文件构建数据帧时,merge()的有效替代方案?

Performance 使用R从json文件构建数据帧时,merge()的有效替代方案?,performance,json,r,Performance,Json,R,我已经编写了以下代码,这些代码可以正常工作,但一旦我开始在数千条记录上执行它,速度就会非常慢: require("RJSONIO") people_data <- data.frame(person_id=numeric(0)) json_data <- fromJSON(json_file) n_people <- length(json_data) for(person in 1:n_people) { person_dataframe <- as.

我已经编写了以下代码,这些代码可以正常工作,但一旦我开始在数千条记录上执行它,速度就会非常慢:

require("RJSONIO")
people_data <- data.frame(person_id=numeric(0))

json_data <- fromJSON(json_file)
n_people <- length(json_data)
for(person in 1:n_people) {
        person_dataframe <- as.data.frame(t(unlist(json_data[[person]])))
        people_data <- merge(people_data, person_dataframe, all=TRUE)
    }

output_file <- paste("people_data",".csv")
write.csv(people_data, file=output_file)
上面代码的最终结果是矩阵,其中列是上面结构中出现的每个人属性,行是每个人的相关值。正如您所看到的,一些人缺少一些数据,因此我需要确保这些数据显示为
NA
,并确保在正确的列中结束。此外,
位置
本身是一个包含两个组件的向量:
状态
邮政编码
,这意味着需要将其展平到
位置。状态
位置。邮政编码
,然后才能与另一个人记录合并;这就是我使用
unlist()
的目的。然后,我将运行的主表保存在
people\u data

上面的代码是有效的,但是您知道一种更有效的方法来完成我要做的事情吗?似乎
merge()
正在将此速度减慢为爬网。。。我有数百个文件,每个文件中有数百人

谢谢! 布莱恩

更新: 根据下面的反馈,我试图建立一个所有人的列表,然后一次性将其转换为数据帧。我让它运行了一夜,仍然没有完成数据帧的制作。名单上大约有120万人。代码如下所示:

require("RJSONIO")
require("plyr")
people_data <- data.frame(person_id=numeric(0))
people_list <- list()

json_data <- fromJSON(json_file)
n_people <- length(json_data)
for(person in 1:n_people) {
        people_list[[person]] <- t(unlist(json_data[[person]]))
    }

#PROBLEM CODE, SLOW, 1/2 million records in people_list
people_data <- rbind.fill(lapply(people_list, as.data.frame))

output_file <- paste("people_data",".csv")
write.csv(people_data, file=output_file)
require(“RJSONIO”)
要求(“plyr”)

人员数据如果您不希望存在重复记录,可以使用包中的
rbind.fill

我假设您知道所有字段的名称。这是解决办法

示例数据


data_list这应该是一个注释,但一旦你将未列出的person对象重新放入列表中,ldply可能会更有效

例如,一旦执行此操作:

for(person in 1:n_people) {
    people_list[[person]] <- t(unlist(json_data[[person]]))
}
for(1人中的人:n人){

人员列表[[人员]]即使存在重复项,我认为rbind.fill-then-unique也会比合并更快。Daniel,rbind.fill可以工作,但看起来并不是非常快。我认为问题可能是Gavin在上面指出的?有两种方法可以更快:json_df@Daniel dickinson,请参阅我在origina中的更新我想这就是我现在正在做的?所以你可能是对的,它是as.data.frame。你分析过代码了吗?你知道大部分时间都花在
merge()上了吗
?这可能是由于您反复合并,以增量方式添加到
人员数据中。
。R中循环中的这种事情通常是关键点,因为R必须复制、展开和分配每个迭代。通常
合并()
很快,所以我怀疑问题在于循环中的增量扩展。我想是的。你知道更有效的方法吗?
record_template <- vector(mode="character",length=length(nm))
names(record_template) <- nm
record_template <- "NA"
rec <- function(x) {
              tmp <- record_template
              tmp[names(unlist(x))] <- unlist(x)
              return(tmp)
       }

do.call(rbind,lapply(data_list,rec))
nm <- unique(unlist(lapply(data_list,function(x) names(unlist(x))),use.names=F))
for(person in 1:n_people) {
    people_list[[person]] <- t(unlist(json_data[[person]]))
}
people_data <- ldply(people_list,function(x) as.data.frame)
people_data <- ldply(people_list,function(x) as.data.frame,.parallel=TRUE)