如何根据另一个向量的值对一个向量进行排序

lea*_*rnr 104 sorting r

我有一个向量x,我想根据向量y中的值的顺序排序.两个向量的长度不同.

x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3)
y <- c(4, 2, 1, 3)
Run Code Online (Sandbox Code Playgroud)

预期结果将是:

[1] 4 4 4 2 2 1 3 3 3
Run Code Online (Sandbox Code Playgroud)

Geo*_*tas 164

这个如何

x[order(match(x,y))]
Run Code Online (Sandbox Code Playgroud)

  • 这是非常好的,比接受的答案恕我直言更好,因为它更一般. (24认同)
  • 我甚至会说这应该是基础GNU-R. (2认同)

Ian*_*ows 71

这是一个班轮......

y[sort(order(y)[x])]
Run Code Online (Sandbox Code Playgroud)

[编辑:]这分解如下:

order(y)             #We want to sort by y, so order() gives us the sorting order
order(y)[x]          #looks up the sorting order for each x
sort(order(y)[x])    #sorts by that order
y[sort(order(y)[x])] #converts orders back to numbers from orders
Run Code Online (Sandbox Code Playgroud)

  • 通常,即使y不是1:length(y)的排列,也可能想要这样做.在这种情况下,此解决方案不起作用,但下面的gd047解决方案x [order(match(x,y))]确实如此. (5认同)
  • 我真的很困惑,为什么这有40个赞成票.它对`x`和`y`的这么多简单变化都失败了.`x < - c(1,4,2); y < - c(1,2,4)`例如. (4认同)
  • 这很漂亮,并且很好地理解了R的内置插件.+1 (3认同)

Mat*_*ker 6

您可以转换x为有序因子:

x.factor <- factor(x, levels = y, ordered=TRUE)
sort(x)
sort(x.factor)
Run Code Online (Sandbox Code Playgroud)

显然,将数字更改为因子可以从根本上改变下游代码对x. 但是由于您没有向我们提供有关接下来会发生什么的任何背景信息,我想我会建议将其作为一种选择。


God*_*eke 0

x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3)
y <- c(4, 2, 1, 3)
for(i in y) { z <- c(z, rep(i, sum(x==i))) }
Run Code Online (Sandbox Code Playgroud)

z 中的结果: 4 4 4 2 2 1 3 3 3

重要步骤:

  1. for(i in y) -- 循环感兴趣的元素。

  2. z <- c(z, ...) -- 依次连接每个子表达式

  3. rep(i, sum(x==i)) -- 重复 i(当前感兴趣的元素) sum(x==i) 次(我们在 x 中找到 i 的次数)。