У меня есть две таблицы. У каждого есть информация с 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
Вы сравниваете каждую строку в «облачном» с каждой строкой в «облаке». Если у обоих есть 470000 записей, чем у 470000 * 470000, то это очень много. Предполагая, что оба входных файла отсортированы в порядке дат-времени, выполните некоторые исследования по «слиянию» двух файлов. – AdrianHHH
AdrianHHH прав, это не R специфично, речь идет об общих алгоритмах. Используйте некоторый индекс для сокращения времени поиска. Не используйте цикл for, вы используете алгоритм, который имеет порядок o (n^2) с точки зрения сложности. Сортированная таблица должна довести это до (n log (n)), и если вы можете себе это позволить, просто сделайте прямой массив (так как ваши данные равномерно распределены без отверстий), чтобы сделать его o (n) – BlueTrin
облако отбирается 3 часов, в то время как cloudFull отбирается на 1 минуту, что означает, что облако в 180 раз меньше. но я буду смотреть на «слияние», спасибо! –