как вы делаете последовательность, используя вместе. с для уникальных значений в r

Предположим, у меня есть вектор числовых значений

  [1]  2844  4936  4936  4972  5078  6684  6689  7264  7264  7880  8133  9018  9968  9968 10247
 [16] 11267 11508 11541 11607 11717 12349 12349 12364 12651 13025 13086 13257 13427 13427 13442
 [31] 13442 13442 13442 14142 14341 14429 14429 14429 14538 14872 15002 15064 15163 15163 15324
 [46] 15324 15361 15361 15400 15624 15648 15648 15648 15864 15864 15881 16332 16847 17075 17136
 [61] 17136 17196 17843 17925 17925 18217 18455 18578 18578 18742 18773 18806 19130 19195 19254
 [76] 19254 19421 19421 19429 19585 19686 19729 19729 19760 19760 19901 20530 20530 20530 20581
 [91] 20629 20629 20686 20693 20768 20902 20980 21054 21079 21156

и я хочу создать последовательность по этому вектору, но для уникальных чисел. Например

length(unique(vector))

равно 74, а всего в векторе 100 значений. Последовательность должна состоять только из чисел от 1 до 74, но иметь длину 100, так как некоторые числа будут повторяться.

Любая идея о том, как это можно сделать? Спасибо.


r seq
person syebill    schedule 02.02.2015    source источник


Ответы (2)


Возможно

 res <- as.numeric(factor(v1))
 head(res)
 #[1] 1 2 2 3 4 5

Or

 res1 <- match(v1, unique(v1))

Or

 library(fastmatch)
 res2 <- fmatch(v1, unique(v1))

Or

res3 <- findInterval(v1, unique(v1))

данные

v1 <- c(2844, 4936, 4936, 4972, 5078, 6684, 6689, 7264, 7264, 7880, 
8133, 9018, 9968, 9968, 10247, 11267, 11508, 11541, 11607, 11717, 
12349, 12349, 12364, 12651, 13025, 13086, 13257, 13427, 13427, 
13442, 13442, 13442, 13442, 14142, 14341, 14429, 14429, 14429, 
14538, 14872, 15002, 15064, 15163, 15163, 15324, 15324, 15361, 
15361, 15400, 15624, 15648, 15648, 15648, 15864, 15864, 15881, 
16332, 16847, 17075, 17136, 17136, 17196, 17843, 17925, 17925, 
18217, 18455, 18578, 18578, 18742, 18773, 18806, 19130, 19195, 
19254, 19254, 19421, 19421, 19429, 19585, 19686, 19729, 19729, 
19760, 19760, 19901, 20530, 20530, 20530, 20581, 20629, 20629, 
20686, 20693, 20768, 20902, 20980, 21054, 21079, 21156)
person akrun    schedule 02.02.2015
comment
Я бы выбрал ваш первый вариант как наиболее логичный подход. - person A5C1D2H2I1M1N2O1R2T1; 02.02.2015

Для этого вы можете использовать .GRP из "data.table":

library(data.table)
y <- as.data.table(x)[, y := .GRP, by = x]
head(y)
#       x y
# 1: 2844 1
# 2: 4936 2  ## Note the duplicated value
# 3: 4936 2  ## in these rows, corresponding to x
# 4: 4972 3
# 5: 5078 4
# 6: 6684 5
tail(y)
#        x  y
# 1: 20768 69
# 2: 20902 70
# 3: 20980 71
# 4: 21054 72
# 5: 21079 73
# 6: 21156 74  ## "y" values go to 74
person A5C1D2H2I1M1N2O1R2T1    schedule 02.02.2015
comment
Спасибо вам обоим. - person syebill; 02.02.2015
comment
@ user42571, ваши данные всегда уже отсортированы? Возможно, вам придется посмотреть это в зависимости от используемого вами подхода и желаемого результата. - person A5C1D2H2I1M1N2O1R2T1; 02.02.2015