用“For Loop”填充矩阵需要太长时间

时间:2014-02-09 02:11:09

标签: json r for-loop bigdata

我试图通过使用for循环创建一个大约1,000,000 x 5的数据框,但它已经超过了5个小时而且我认为它很快就会完成。我使用rjson库从大型json文件中读取数据。有人可以帮助我以更快的方式填写这个数据框吗?

library(rjson)

# read in data from json file
file <- "/filename"
c <- file(file, "r")
l <- readLines(c, -1L)
data <- lapply(X=l, fromJSON)

# specify variables that i want from this data set
myvars <- c("url", "time", "userid", "hostid", "title")
newdata <- matrix(data[[1]][myvars], 1, 5, byrow=TRUE)

# here's where it goes wrong
for (i in 2:length(l)) {
newdata <- rbind(newdata, data[[i]][myvars])
}

newestdata <- data.frame(newdata)

2 个答案:

答案 0 :(得分:1)

没有数据,很难确定,但有些事情你做得比较慢。这应该更快,但是,如果没有数据,我无法测试:

newdata <- vapply(data, `[`, character(5L), myvars)

我还假设您的datacharacter,我认为它必须基于title

另外,正如其他人所说,你的原因很慢,因为你正在增长一个对象,这需要R继续重新分配内存。 vapply将提前分配内存,因为它知道每个迭代结果的大小,以及有多少项。

答案 1 :(得分:1)

这是永远的,因为你的循环的每次迭代都在创建一个新的,更大的对象。试试这个:

slice <- function(field, data) unlist(lapply(data, `[[`, field))
data.frame(Map(slice, myvars, list(data)))

这将创建一个data.frame并保留原始数据类型:字符,数字等,如果重要的话。将所有内容强制转换为矩阵会将所有内容强制转换为字符类。