Я не уверен, как назвать его, но если у меня есть список значений, таких как:
set.seed(2084)
vals = round(runif(12, 1, 3))
[1] 2 3 2 2 1 1 3 2 1 2 2 2
и я сортирую это у меня есть:
[1] 1 1 1 2 2 2 2 2 2 2 3 3
Но я хочу получить что-то вроде альтернативной сортировки (взять 1-2-3 и повторите):
1 2 3 1 2 3 1 2 2 2 2 2
Но проблема в том, что есть 7 двойок, и они следуют за списком, а не чередуются между другими значениями,Я предпочел бы получить что-то вроде:
1 2 2 3 1 2 2 2 1 2 2 3
или
1 2 2 3 1 2 2 3 12 2 2
Как я могу проиндексировать его, чтобы получить наиболее равномерно распределенные значения этого порядка "роста и обрезки"?
Чтобы дать некоторое представление о моей идее.Из множества N уникальных значений (здесь 3) нам нужно распределить каждое из них как можно дальше друг от друга (и от границ этого вектора).Таким образом, в то время как у нас есть 1 и 10 слотов, мы можем поместить их как в этом шаблоне:
= 1 = = = 1 = = = 1
или
= =1 = = 1 = = 1 =
Это верно, если другие номера не имеют соответствующих позиций в этом списке.Мы можем добавить тройки:
= 3 1 = = 1 = 3 1 =
Теперь у нас есть только две пары для заполнения. У них не будет идеальных позиций.Я думаю, что было бы лучше начать с числа с наиболее распространенными значениями.
Я хотел бы прояснить и описать некоторый алгоритм, но я чувствую, что это обратный эффект.
# EDIT # Я думаю, для больших наборов данных тема могла бы стоять "какравномерно распределить значения в заданном векторе, используя R ".Возможно, это может быть безопасным выходом из этой ситуации, если это приведет к недоразумению.Но здесь я не хочу иметь 2 номера, кроме того, пока доступно 5 слотов.
Для 1 2 2 3 4
есть альтернатива, например, 1 2 3 4 2
.
РЕДАКТИРОВАТЬ 2
Я нашел функцию для 2 значений -это полу-решение, но идея работает.Я думаю, что это будет итеративно для более чем 2 значений, но, возможно, я ошибаюсь.
Это не очень элегантно
antisort <- function(vals) {
l = length(unique(vals))
mx = names(which.max(table(vals)))
mn = names(which.min(table(vals)))
mxn = max(table(vals))
indx = round(seq(from = 1, to = length(vals), length.out = mxn))
vec = NULL
for (i in indx) {
vec[i] <- mx
}
vec[which(is.na(vec))] <- mn
return(vec)
}
data:
set.seed(2201)
vals = round(runif(12, 1, 2))
Выполнить:
antisort(vals)
Результат (независимо от того, что он струнный)
"2" "1" "2" "1" "2" "2" "1" "2" "1"" 2 "" 1 "" 2 "