按两个数字的差异排序

时间:2016-12-11 14:17:38

标签: r

我希望通过最大和最小数字的差异以越来越多的方式对数组进行排序。 没有循环。

我想我需要一种可以给出条件的但我无法找到的方式。

这样的事情:

sort(arr, decreasing = FALSE, by = max(a) - min(a))
sort(arr, decreasing = FALSE, condition = max(a) - min(a))

排序后的数组必须如下所示。与第一个和第二个数字的差异是数组中所有数字的最小值,与第二个和第三个数字的差异是第二个最小......

示例://我的事情就像这样

阵列(22,2,32,3,6,9,7,23,11,13)

sorted_array(9,11,7,13,6,22,3,23,2,32)

我的另一种方法是构造排序的数组,将最小的数字放在最小的数字之后,最小的数字,第二个最小的,第二个最小的数字...... ...

抱歉说不好。

2 个答案:

答案 0 :(得分:2)

这是一个如何工作的想法,但仅适用于长度均匀的数组。如果您想使用此解决方案并且阵列不均匀,则可以使用if。我需要承认它必须紧急,我想使用这样的结构而不是循环。

x <- c(22, 2, 32, 3, 6, 9, 7, 23, 11, 13)
n <- length(x)
m <- floor(n/2)

rev(
 as.numeric(
  rbind(
   sort(x)[n-c(0:(m-1))],
   sort(x)[1:m]
  )
 )
)

答案 1 :(得分:0)

我试图想出一个非for-loop结构。所以我首先对序列进行排序,然后通过命名前半部分将其分成两部分&#34; a_N&#34;和下半年&#34; b_N&#34;然后&#34;折叠它&#34;进入两列矩阵,前半部分反转,最后用c展开读出:

my_arr <- c(22, 2, 32, 3, 6, 9, 7, 23, 11, 13)
names(my_arr) <- paste0( rep( c("a","b"), each=length(my_arr)/2), order(my_arr) )
c( rbind( sort( my_arr[grep("a", names(my_arr))], decreasing=TRUE), #first half
           my_arr[grep("b", names(my_arr))]) )  # second half
 #[1]  9 11  7 13  6 22  3 23  2 32

您可以看到矩阵的中间值:

rbind( sort( my_arr[grep("a", names(my_arr))], decreasing=TRUE), my_arr[grep("b", names(my_arr))])
     a5 a4 a3 a2 a1
[1,]  9  7  6  3  2
[2,] 11 13 22 23 32

由于R矩阵按列顺序读出,因此您可以使用c()进行所需的交错,这也会删除名称。