2014-09-29 1 views
3

У меня есть две таблицы. У каждого есть информация с 2012 по 2014 год с периодом 3 часа. Это выглядит следующим образом:Для цикла требуется навсегда для запуска

    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 

Теперь мне нужно значения 2-го и 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

Вы сравниваете каждую строку в «облачном» с каждой строкой в ​​«облаке». Если у обоих есть 470000 записей, чем у 470000 * 470000, то это очень много. Предполагая, что оба входных файла отсортированы в порядке дат-времени, выполните некоторые исследования по «слиянию» двух файлов. – AdrianHHH

+0

AdrianHHH прав, это не R специфично, речь идет об общих алгоритмах. Используйте некоторый индекс для сокращения времени поиска. Не используйте цикл for, вы используете алгоритм, который имеет порядок o (n^2) с точки зрения сложности. Сортированная таблица должна довести это до (n log (n)), и если вы можете себе это позволить, просто сделайте прямой массив (так как ваши данные равномерно распределены без отверстий), чтобы сделать его o (n) – BlueTrin

+0

облако отбирается 3 часов, в то время как cloudFull отбирается на 1 минуту, что означает, что облако в 180 раз меньше. но я буду смотреть на «слияние», спасибо! –

ответ

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

спасибо! это помогло, и теперь это займет пару минут! –