【发布时间】:2011-12-21 22:33:45
【问题描述】:
我正在尝试重构一个巨大的数据框(大约 12.000 个案例):在旧的数据框中,一个人是一行,大约有 250 列(例如,Person 1、test A1、testA2、testB...)我想要测试 A 的所有结果(1 - 10 A 的总体结果和该人在一列中的 24 个项目(AY),所以一个人最终有 24 列和 10 行。在项目 AY 之前还有一个固定的数据框部分开始(个人信息,如年龄、性别等),我想保持原样(fixdata)。 该函数/循环适用于 30 个案例(我提前尝试过),但对于 12.000,它仍在计算,现在将近 24 小时。任何想法为什么?
restructure <- function(data, firstcol, numcol, numsets){
out <- data.frame(t(rep(0, (firstcol-1)+ numcol)) )
names(out) <- names(daten[0:(firstcol+numcol-1)])
for(i in 1:nrow(daten)){
fixdata <- (daten[i, 1:(firstcol-1)])
for (j in (seq(firstcol, ((firstcol-1)+ numcol* numsets), by = numcol))){
flexdata <- daten[i, j:(j+numcol-1)]
tmp <- cbind(fixdata, flexdata)
names(tmp) <- names(daten[0:(firstcol+numcol-1)])
out <- rbind(out,tmp)
}
}
out <- out[2:nrow(out),]
return(out)
}
提前致谢!
【问题讨论】:
-
这听起来像是一个重塑问题。查看包
reshape2中的函数melt。你的data.frame真的没有那么大。如果melt不能在不到一秒的时间内处理这个问题,我会感到非常惊讶。 (类似的问题经常出现在 SO 上。搜索[r] reshape以获得一些灵感。 -
安德烈是正确的。一般来说,尽量不要在大数据集上使用 for 循环。同时,您可以进行如下实验:
system.time(restructure([30datasets])),然后是system.time(restructure([300datasets])),等等。这至少可以让您了解现有代码需要多长时间才能处理 N 个数据集。 -
添加一个测试用例会有所帮助...
-
@CarlWitthoft:循环不是主要问题,内存分配才是。内部循环内的
cbind和rbind调用将使代码比在第一个循环外预先分配out并通过索引分配结果时慢得多。 -
好的,我会尝试“融化”。我以前从未使用过 reshape 包。你能告诉我在那种特定情况下我将如何使用“melt”吗?
标签: r function for-loop data-management large-data