我不确定如何命名它,但如果我有一个值列表,例如:
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 1 2 2 2
我怎样才能索引它以获得这个“增长和切割”顺序的最均匀分布的值?
对我的想法发表一些看法。从 N 个唯一值的集合(这里是 3 个)中,我们需要将它们中的每一个尽可能地分布在彼此之间(以及远离该向量的边界)。因此,虽然我们有 1 和 10 个插槽,但我们可以将其放入以下模式中:
= 1 = = = 1 = = = 1
或者
= = 1 = = 1 = = 1 =
除非其他数字在此列表中具有适当的位置,否则它是正确的。我们可以添加三个:
= 3 1 = = 1 = 3 1 =
现在,我们只有两个要填写。他们不会有理想的位置。我认为最好从具有最丰富值的数字开始。
我想说清楚并描述一些算法,但我觉得反之亦然。
# 编辑 #
我猜对于较大的数据集,该主题可以代表“如何使用 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)
}
数据:
set.seed(2201)
vals = round(runif(12, 1, 2))
跑:
antisort(vals)
结果(不管它是串起来的)
“2”“1”“2”“1”“2”“2”“1”“2”“1”“2”“1”“2”
最佳答案
其中之一可能是您所追求的:
rep_len(unique(vals), length(vals))
或者
rep_len(sort(unique(vals)), length(vals))
关于r - 如何使用 R 对数据进行反排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54469177/