2014-10-20 2 views
0

Я нашел его очень медленным для каждого уровня фактора.Как улучшить производительность: цикл для каждого уровня фактора (в 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 } 
    } 
} 
+0

Для первой части вашего вопроса, просто 'таблица (данные $ поезда)' будет достаточно, чтобы знать, сколько строк каждый уровень имеет поезд. – nicola

ответ

-1

Как об использовании dplyr пакета. Он был написан именно для этой цели Хэдли и очень интуитивно понятен в использовании. Следующие ссылки содержат учебники по этому пакету.

http://rstudio-pubs-static.s3.amazonaws.com/11068_8bc42d6df61341b2bed45e9a9a3bf9f4.html

http://www.r-bloggers.com/hands-on-dplyr-tutorial-for-faster-data-manipulation-in-r/

https://www.youtube.com/watch?v=jWjqLW-u3hc

+0

Спасибо @koundy! Я попробовал - это быстрее! (Хотя и не на 1000 раз быстрее, как упоминалось в руководстве по data.table - некоторые люди сказали, что data.table и dplyr сравнимы по производительности) –

+0

Примите мой ответ, если он решит вашу проблему .. :-) – Koundy