2014-09-29 106 views
3

我有两个表。一个从2012年到2014年的信息与3小时的时间。它看起来像这样:For循环需要永久运行

    B C 
1 01.06.2012 00:00 10 0 
2 01.06.2012 03:00 10 0 
3 01.06.2012 06:00 10 6 
4 01.06.2012 09:00 7,5 0 
5 01.06.2012 12:00 6 2,5 
6 01.06.2012 15:00 6 0 
7 01.06.2012 18:00 4 0 
8 01.06.2012 21:00 4 0 
9 02.06.2012 00:00 0 0 
10 02.06.2012 03:00 0 0 

其他表是相同的时间,但1分钟取样:

1 01.06.2012 00:00  
2 01.06.2012 00:01  
3 01.06.2012 00:01  
4 01.06.2012 00:03  
5 01.06.2012 00:03  
6 01.06.2012 00:05  
7 01.06.2012 00:05  
8 01.06.2012 00:07  
9 01.06.2012 00:08  
10 01.06.2012 00:09  
11 01.06.2012 00:10 

现在,我需要第二次的第二个表的值和第3行关联到第一个,这样如果来自第二个表的时间戳在第一个表的timestamp(i)timestamp(i+1)之间,它将采用B(i)C(i)并复制它们。我有这个代码,我知道它的工作原理,但运行它需要超过12个小时,而且我有许多这样的文件需要以相同的方式进行工作。

clouds <- read.csv('~/2012-2014 clouds info.csv', sep=";", header = FALSE) 
cloudFull <- read.csv('~/2012-2014 clouds.csv', sep=";", header = FALSE) 

for (i in 1:nrow(cloudFull)){ 
    dateOne <- strptime(cloudFull[i,1], '%d.%m.%Y %H:%M') 

    for (j in 1:nrow(clouds)){ 
    bottomDate = strptime(clouds[j,1], '%d.%m.%Y %H:%M') 
    upperDate = strptime(clouds[j+1,1], '%d.%m.%Y %H:%M') 
    if ((dateOne >= bottomDate) && (dateOne < upperDate)) { 
     cloudFull[i,2] <- clouds[j,2] 
     cloudFull[i,3] <- clouds[j,3] 
     break 

    } 

    } 
} 

write.csv(cloudFull, file = 'cc.csv') 

现在我该如何让它运行得更快? object.size(cloudFull)给我39580744字节,它有470000行,但其他文件将有更多的数据。我刚刚开始与R(迄今只有2天工作),我会很感激任何意见,在一个非常简单的语言:D

+1

您正将'cloudfull'中的每一行与'cloud'中的每一行进行比较。如果两者都有470000个条目比470000 * 470000个比较,这是很多。假设两个输入文件按日期时间顺序排序,然后对“合并”两个文件进行一些研究。 – AdrianHHH 2014-09-29 11:38:20

+0

AdrianHHH是对的,它不是R特定的,它是关于通用算法。使用某种索引来缩短搜索时间。不要使用for循环,就复杂性而言,您使用的算法的顺序为o(n^2)。一个有序的表应该把它带到o(n log(n)),如果你可以负担得起,只需制作一个直线阵列(因为你的数据是等距离无孔的),使它成为o(n) – BlueTrin 2014-09-29 11:44:39

+0

云被3采样小时,而cloudFull采样1分钟,这意味着云小180倍。但我会研究“合并”,谢谢! – 2014-09-29 11:46:15

回答

4

它很难知道你的真实数据看起来像什么,但沿着

full <- strptime(cloudFull[,1], '%d.%m.%Y %H:%M') 
ref <- strptime(clouds[,1], '%d.%m.%Y %H:%M') 
## ref <- sort(ref) 
cloudsFull[, 2:3] <- clouds[findInterval(full, ref), 2:3] 

使用findInterval()行改变成问题一个线性扩展,而不是二次。

+0

谢谢!这有帮助,现在只需要几分钟! – 2014-09-30 03:03:40