Я нашел его очень медленным для каждого уровня фактора.Как улучшить производительность: цикл для каждого уровня фактора (в R)
Данные расписание некоторых поездов:
col1 col2 col3 col4 col5
train start density starttime arrivaltime
[factor] [factor] [factor] [date&time] [date&time]
Есть 10m строки. Есть ~ 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 }
}
}
Для первой части вашего вопроса, просто 'таблица (данные $ поезда)' будет достаточно, чтобы знать, сколько строк каждый уровень имеет поезд. – nicola