如何提高性能:循环为一个因素的每个级别(在R)
我发现它非常缓慢循环的因素的每个级别。如何提高性能:循环为一个因素的每个级别(在R)
的数据是部分列车的时间表:
col1 col2 col3 col4 col5
train start density starttime arrivaltime
[factor] [factor] [factor] [date&time] [date&time]
有10米行。有大约1K列车,所以每列列车都有10K列。
我尝试下面的测试代码:
data = data[order(data$train, data$starttime), ] # sort according to train, and then according to starttime
length1 = numeric(length(levels(data$train)) )
ii = 1
sub = data[1,] # initialize it
for (t in levels(data$train))
{
sub = subset(data, train==t) #subset of each train
length1[ii] = nrow(sub)
ii = ii +1
print(ii)
}
它的工作原理很慢 - 几秒钟,我的笔记本电脑每个循环。我想知道我能做些什么来提高效率。
例如,sub
是在每个循环中变化的变量。我应该避免将这些行复制到sub
? sub
更改循环时的长度,初始化时我应该给它更大的内存空间吗?
ps 我真正想要做的是,对于每一列火车,如果命运城市==下一趟旅行的开始城市。代码是:
data = data[order(data$train, data$starttime), ] # sort according to train, and then according to starttime
sub = data[1,] # initialization
for (t in levels(data$train))
{
sub = subset(data, train==t) #subset of each train
for (i in 1:(nrow(sub)-1) )
{
if (as.character(sub$destiny[i]) != as.character(sub$start[i+1]))
# if the destiny != the start city of the next trip
{ do something }
}
}
如何使用dplyr
包。它是由哈德利完全为此编写的,使用非常直观。以下链接有关于该软件包的教程。
http://rstudio-pubs-static.s3.amazonaws.com/11068_8bc42d6df61341b2bed45e9a9a3bf9f4.html
http://www.r-bloggers.com/hands-on-dplyr-tutorial-for-faster-data-manipulation-in-r/
谢谢@koundy!我试过了 - 速度更快!(虽然不是data.table手册中提到的1000倍速度 - 有人说data.table和dplyr在性能上相当) – 2014-10-20 09:25:17
如果它解决了你的问题,请接受我的答案.. :-) – Koundy 2014-10-20 09:30:25
对于你的问题的第一部分,一个简单的'表(数据$列车)'就足以知道每个列车级多少行了。 – nicola 2014-10-20 08:32:31