2017-01-08 3 views
-5

Я сделал функцию, чтобы увеличить счетчик всякий раз, когда значение в векторе изменений:Увеличение счетчика при изменении значения

track_change = function(x) { 
    counter = numeric(length(x)) 
    for (i in seq_along(x)) { 
    if (i > 1 && x[i] != x[i-1]) 
     counter[i] = counter[i-1] + 1 
    else if (i > 1) 
     counter[i] = counter[i-1] 
    } 
    counter 
} 

Пример (посмотреть, как track изменения при каждом изменении carb):

mtcars$track = track_change(mtcars$carb) 

head(mtcars[, 10:12]) 
        gear carb track 
Mazda RX4   4 4  0 
Mazda RX4 Wag  4 4  0 
Datsun 710   4 1  1 
Hornet 4 Drive  3 1  1 
Hornet Sportabout 3 2  2 
Valiant    3 1  3 

Есть ли лучший способ сделать это в R? (Он также должен иметь возможность отслеживать изменения в нечисловых векторов, в том числе. Списки.)

ответ

0

Мы можем сделать это с rleid из data.table

library(data.table) 
rleid(mtcars$carb)-1 

Или с rle из base R

inverse.rle(within.list(rle(mtcars$carb), values <- seq_along(values))) - 1 
+0

Спасибо. Решение 'for loop' на самом деле примерно на 5-10% быстрее, чем' rle' подход по моим данным (только FYI). – jakub

+0

@jakub Я бы сказал, что вы должны проверить тесты на более крупном наборе данных, то есть около миллиона или более данных – akrun

Смежные вопросы