我试图通过使用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)
答案 0 :(得分:1)
没有数据,很难确定,但有些事情你做得比较慢。这应该更快,但是,如果没有数据,我无法测试:
newdata <- vapply(data, `[`, character(5L), myvars)
我还假设您的data
是character
,我认为它必须基于title
。
另外,正如其他人所说,你的原因很慢,因为你正在增长一个对象,这需要R继续重新分配内存。 vapply
将提前分配内存,因为它知道每个迭代结果的大小,以及有多少项。
答案 1 :(得分:1)
这是永远的,因为你的循环的每次迭代都在创建一个新的,更大的对象。试试这个:
slice <- function(field, data) unlist(lapply(data, `[[`, field))
data.frame(Map(slice, myvars, list(data)))
这将创建一个data.frame并保留原始数据类型:字符,数字等,如果重要的话。将所有内容强制转换为矩阵会将所有内容强制转换为字符类。