Я перезаписываю некоторые R-скрипты, которые анализируют большие объемы данных (~ 17 миллионов строк), и я думал, что попытаюсь улучшить его эффективность памяти, используя пакет data.table
(который я только изучаю!).
Одна часть кода несколько озадачивала меня. Я не могу опубликовать свое оригинальное решение, потому что (1) это дерьмо (медленное!) И (2) оно очень тонкое по отношению к данным и просто усложнит этот вопрос.
Вместо этого я сделал этот пример с игрушкой (и это действительно пример игрушки):
ds <- data.table(ID=c(1,1,1,1,2,2,2,3,3,3),
Obs=c(1.5,2.5,0.0,1.25,1.45,1.5,2.5,0.0,1.25,1.45),
Pos=c(1,3,5,6,2,3,5,2,3,4))
Что выглядит так:
ID Obs Pos
1: 1 1.50 1
2: 1 2.50 3
3: 1 0.00 5
4: 1 1.25 6
5: 2 1.45 2
6: 2 1.50 3
7: 2 2.50 5
8: 3 0.00 2
9: 3 1.25 3
10: 3 1.45 4
Для удобства объяснения я буду притворяться, что мы наблюдаем поезда (каждый поезд имеет свой собственный ID), перемещаясь по линейной односторонней дорожке с наблюдениями (некоторое значение, а не импорт на вопрос) о поезд, который делается на заданных позициях ( pos, здесь от 1 до 6) вдоль дорожки. Не ожидается, что поезд будет делать его по всей длине трека (возможно, он взорвался, прежде чем перейти к пункту 6), и иногда наблюдение упускается наблюдателем... Позиции последовательны (при этом, если мы пропустили наблюдение поезд в положении 4, но мы наблюдали его в положении 5, мы знаем, что он должен пройти через позицию 4).
Из приведенной выше таблицы данных мне нужно создать такую таблицу:
Pos Count
1: 1 3
2: 2 3
3: 3 3
4: 4 3
5: 5 2
6: 6 1
Где для каждого уникального Pos в моей data.table ds, у меня есть счет количества поездов, которые попали в эту позицию на треке (или дальше), независимо от того, было ли наблюдение был сделан в этом положении на трассе.
Если у кого-нибудь есть идеи или предложения относительно того, как справиться с этим, это было бы очень признательно. К сожалению, я недостаточно разбираюсь в data.table, чтобы узнать, можно ли это сделать! Или это может быть невероятно простая проблема для решения, и я просто медленно:)