我目前正在研究一个大型数据集(约1.5M的条目)使用R - 一种我还不完全熟悉的语言。
基本上,我尝试做的是以下内容: 我想检查在"开始"之后的时间间隔内发生了什么。 "开始"代表每个"试验"和"试验"中的一些时间值。表示为参考"参考"记录的所有试验。
因此,对于每个参考,我想检查所有试验,看看在此试验期间"开始"之后会发生什么
如果我试图做的事情仍然模糊不清,那就不是那么重要了,那就是我要检查数据框中的每一个数据。
我的本能(理解,R-noob-ish)编程这个函数的方式让我得到了一段代码,我知道它远未被优化,并且需要很多时间才能运行。
My_Function <- function(DataFrame){
counts <- data.frame()
for (reference in DataFrame$Ref){
ref_tested <- subset(DataFrame, Ref == reference)
ref_count <- data.frame()
for (trial in ref_tested$Trial){
trial_tested <- subset(ref_tested, Trial == trial)
for (timing in trial_tested$Start){
interesting <- subset(DataFrame, Start > timing & Start <= timing + some_time & Trial == trial)
ref_count <- rbind(ref_count,as.data.frame(table(interesting$ele)))
}
}
temp <- aggregate(Freq~Var1,data=ref_count,FUN=sum);
counts <- rbind (counts, temp)
}
return(counts)
}
这里, as.data.frame(table(有趣的是$ ele))可以有不同的长度,因此 ref_count 也是如此。
我没有找到一种在不使用rbind的情况下扩展数据帧的方法,但我也知道,考虑到输出的大小,它根本不是时间效率的。 此外,我已经使用其他语言编写过程序,例如Python或C ++(很久以前),并且知道连续3个for循环通常意味着你做错了。但话说回来,我没有办法在这种特殊情况下避免这样做。
那么,对于如何使用R或其中一个包来避免这种情况,您有什么建议吗?
提前谢谢你,
ķ。
编辑: 感谢您的第一个建议。
我试过了&#39; plyr&#39;包,并能够减少我的代码chunck的大小 - 它按预期的那样做,并且更容易理解.Plus,我能够为再现性生成一些示例数据。见:
#Example Input
DF <- data.frame(c(sample(1:400,500000, replace = TRUE)),c(sample(1:25,500000, replace = TRUE)), rnorm(n=500000, m=1, sd=1) )
colnames(DF)<-c("Trial","Ref","Start")
DF$rn<-rownames(DF)
tempDF <- DF[sample(nrow(DF), 100), ] #For testing purposes
Test<- ddply(.data = tempDF, "rn", function(x){
interesting <- subset(DF,
Trial == x$Trial &
Start > x$Start &
Start < x$Start + some_time )
interesting$Elec <- x$Ref
return(interesting)
})
这很好,但我仍然觉得这不是要走的路;在这个例子中,我们只浏览了100个观察,这需要大约4秒(我使用了system.time()),但如果我想扫描DF的500000个观测值,那么它需要花费超过5个小时。
我已经检查过data.table但我现在仍在尝试了解如何使用它。