Подсчет и упорядочение уникальных значений в R - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь найти / создать функцию, которая может взять один вектор и вернуть вектор такой же длины, который «считает» экземпляр # этого значения.Например:

Для ввода:

a <- c(4, 4, 4, 4, 6, 6, 5, 5, 5, 6, 6, 4)

Мне бы хотелось получить вывод:

1,2,3,4,1,2,1,2,3,3,4,5

Я построил цикл for, который работает просто отлично, ноЭто мучительно долго, когда я на самом деле пытаюсь применить его к своему набору данных (~ 100 000 строк, даже не так много!).Я также нашел rleid из data.table, который подходит близко, но все еще не совсем правильно.

1 Ответ

0 голосов
/ 01 марта 2019

В базе R вы можете использовать

ave(a, a, FUN = seq_along)
# [1] 1 2 3 4 1 2 1 2 3 3 4 5

С data.table использовать rowid

data.table::rowid(a)
# [1] 1 2 3 4 1 2 1 2 3 3 4 5

эталон

set.seed(1)
aa <- sample(1:10, 1e6, TRUE)

library(microbenchmark)
benchmark <- microbenchmark(
  baseR = ave(aa, aa, FUN = seq_along),
  data.table = rowid(aa)
)

autoplot(benchmark)

enter image description here

benchmark
#Unit: milliseconds
#       expr       min        lq     mean   median       uq      max neval cld
#      baseR 51.161437 52.672874 55.75084 53.81096 57.66393 80.09238   100   b
# data.table  9.242893  9.811798 13.30292 10.47203 12.12332 36.88062   100  a 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...