Для алгоритма кластеризации, который я реализую, я хотел бы инициализировать назначения кластеров наугад. Однако мне нужно, чтобы не было пробелов. То есть, это не нормально:Создайте N случайных целых чисел без пробелов
set.seed(2)
K <- 10 # initial number of clusters
N <- 20 # number of data points
z_init <- sample(K,N, replace=TRUE) # initial assignments
z_init
# [1] 2 8 6 2 10 10 2 9 5 6 6 3 8 2 5 9 10 3 5 1
sort(unique(z_init))
# [1] 1 2 3 5 6 8 9 10
где метки 4 и 7 не использовались.
Вместо этого, я хотел бы этот вектор будет:
# [1] 2 6 5 2 8 8 2 7 4 5 5 3 6 2 4 7 8 3 4 1
где метка 5 становится 4 и так далее, чтобы заполнить пустые ниже метки.
Другие примеры:
- Вектор
1 2 3 5 6 8
должен быть̀1 2 3 4 5 6 7
- Вектор
15,5,7,7,10
должен быть̀1 2 3 3 4
Это может быть сделано во избежание for
петли? Мне не нужно быть быстрым, я предпочитаю, чтобы он был элегантным и коротким, так как я делаю это только один раз в коде (для инициализации метки).
Мое решение с использованием for
петли
z_init <- c(3,2,1,3,3,7,9)
idx <- order(z_init)
for (i in 2:length(z_init)){
if(z_init[idx[i]] > z_init[idx[i-1]]){
z_init[idx[i]] <- z_init[idx[i-1]]+1
}
else{
z_init[idx[i]] <- z_init[idx[i-1]]
}
}
z_init
# 3 2 1 3 3 4 5
Извините, но я не знаю вывести логику желаемого вывода. Не могли бы вы уточнить, чего вы пытаетесь достичь? – SabDeM
Возможно, вам придется опубликовать данные о процессе. Определите максимальное количество элементов, отсортируйте их и замените. Функция перекодирования из пакета автомобилей подскакивает. – JJFord3
Почему вы произвольно инициализируете кластерные метки случайным образом, а не кластерные центроиды? Это не имеет смысла для меня –