r - 如何使用 R 对数据进行反排序

标签 r sorting

我不确定如何命名它,但如果我有一个值列表,例如:

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/

相关文章:

r - svyglm 和加权 glm 之间的区别

r - 如何在 R 中使用宏变量? (类似于 SAS 中的 %LET)

java - 有没有办法进一步优化Graham Scan算法来找到凸包?

c++ - 通过交换指针对 char 数组进行排序,C++

mysql - mysql 中是否有按特定行排序的功能?

R: Rgtk2: gwidgets: gWidgetsRGtk2

调整大小 R ggplotly

powershell - 如何在 O365 中对我的邮箱统计数据进行排序?

r - 从 Linux 终端在 R 下将文件内容作为命令执行

java - 如何使用以下代码基于实例变量按升序对对象数组进行排序