Индексирование векторов на r языке - PullRequest
0 голосов
/ 23 мая 2018

мне нужно индексировать вектор определенным образом

Например, у меня есть следующий вектор:

x = c(1,1,2,3,1,1,2,3)

выходные данные функции должны возвращатьтакой вектор

[1,1,2,3,4,4,5,6]

Если число повторяется в векторе x, тогда выходной вектор должен обрабатывать индекс как то же число

Функция должна толькоучитывать последовательные повторяющиеся числа

Вот что я пытался сделать

svector <- function(x){

y = c()

for (i in 1:NROW(x)){

if((x[-length(x)] == x[-1])){

y[i] = y[i+1] 

}else{

next

}
 } 
  }

В моей программе я пытаюсь прочитать первую и вторую запись в векторе, сравнить, если там то же самое, тов пустой вектор y вставить записи

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Функция rleid в пакете data.table предназначена именно для этой цели.Должно быть во много раз быстрее.

x <- sample(1:5e4, 1e6, T)

all.equal(rleid(x), cumsum(x != lag(x, default = 0)))
# TRUE

library(microbenchmark)
microbenchmark(custom = cumsum(x != lag(x, default = 0)), 
               rleid = rleid(x), unit = 'relative')

# Unit: relative
#    expr      min      lq     mean   median       uq      max neval
#  custom 5.481059 6.52852 4.660912 6.816693 5.586913 1.550265   100
#   rleid 1.000000 1.00000 1.000000 1.000000 1.000000 1.000000   100
0 голосов
/ 23 мая 2018

Когда все записи с одинаковым значением должны иметь одинаковый индекс, мы будем использовать

as.numeric(factor(x, levels = unique(x)))

Это предполагает, что непоследовательные повторы разновидности, упомянутой @CPak, игнорируются.Когда индекс должен отличаться, работает следующее:

library(dplyr) # for lag function
cumsum(x != lag(x, default = 0))

или

cumsum(x != c(0, x[-length(x)]))

, что исключает функцию lag

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...