【问题标题】:How may I sort vectors for one vector by another vector?如何按另一个向量对一个向量的向量进行排序?
【发布时间】:2023-04-04 07:50:01
【问题描述】:

假设我有两个向量;我想按 y 对 x 进行排序,以便它们相互依赖:

> x
[1] 1 5 2
> y
[1] 4 5 1

我要y的结果是1,5,4;所以 y 的最小值在第一位,因为 x 的最小值在第一位。

另一个例子是

> x
[1] 1 5 7 3 4 2
> y
[1] 4 5 6 2 6 8
> sort(y)[order(x)]
[1] 2 8 6 6 4 5

上面的方案好像不行,因为x中的最大值在第三位,但是排序后的y中的最大值在第三位。

【问题讨论】:

  • 我不明白这里的逻辑。您是否根据“x”顺序对“y”进行排序
  • 是的,y的顺序应该和x中的一样
  • 但是,您的结果显示基于排序的 y 的顺序
  • 因为x中的最小值在第一位,所以y的最小值也应该在第一位; x 的最大值在第二位,所以我想把 y 的最大值也放在第二位。

标签: r sorting


【解决方案1】:
foo = function(x, y){
    y[match(rank(x, ties.method = "first"), rank(y, ties.method = "first"))]
}
x <- c(1, 5, 2)
y <- c(4, 5, 1)
x1 <- c(1, 5, 7, 3, 4, 2)
y1 <- c(4, 5, 6, 2, 6, 8)
foo(x, y)
#[1] 1 5 4
foo(x1, y1)
#[1] 2 6 8 5 6 4

【讨论】:

  • 这似乎不适用于另一个示例: > x [1] 1 5 7 3 4 2 > y [1] 4 5 6 2 6 8 > sort(y)[order(x)] [ 1] 2 8 6 6 4 5 x中的最大值在第三位,但重新排序后的y中的最大值在第二位。
【解决方案2】:

我们可以使用rank

sort(y)[rank(x)]
[1] 1 5 4
sort(y1)[rank(x1)]
[1] 2 6 8 5 6 4

或者在order上输入order

> sort(y)[order(order(x))]
[1] 1 5 4
> sort(y1)[order(order(x1))]
[1] 2 6 8 5 6 4

数据

x <- c(1, 5, 2)
y <- c(4, 5, 1)
x1 <- c(1, 5, 7, 3, 4, 2)
y1 <- c(4, 5, 6, 2, 6, 8)

【讨论】:

  • 是的,这正是我要找的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2010-12-06
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多