如何基于另一个vector的值来sorting一个vector

我有一个向量x,我想根据向量y中的值的顺序进行sorting。 这两个向量长度不一样。

x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3) y <- c(4, 2, 1, 3) 

预期的结果是:

 [1] 4 4 4 2 2 1 3 3 3 

这是一个单线…

 y[sort(order(y)[x])] 

这个分解如下:

 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 

这个如何

 x[order(match(x,y))] 

你可以把x转换成一个有序的因子:

 x.factor <- factor(x, levels = y, ordered=TRUE) sort(x) sort(x.factor) 

显然,将你的数字转换成因子可以彻底改变下游代码对x反应方式。 但是既然你没有给我们任何关于接下来会发生什么的情况,我想我会build议这个选项。

怎么样?:

 rep(y,table(x)[as.character(y)]) 

(Ian的可能还是更好)

 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))) } 

结果在z:4 4 4 2 2 1 3 3 3

重要步骤:

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

  2. z < – c(z,…) – 依次连接每个子expression式

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

[ 编辑:显然伊恩有正确的做法,但我会留下这个后代。]

你可以在没有循环的情况下通过索引你的y向量来做到这一点。 向y添加递增的数字值并合并它们:

 y <- data.frame(index=1:length(y), x=y) x <- data.frame(x=x) x <- merge(x,y) x <- x[order(x$index),"x"] x [1] 4 4 4 2 2 1 3 3 3 

如果您需要对“y”进行订购,无论是数字还是字符:

 x[order(ordered(x, levels = y))] 4 4 4 2 2 1 3 3 3 

按步骤:

 a <- ordered(x, levels = y) # Create ordered factor from "x" upon order in "y". [1] 2 2 3 4 1 4 4 3 3 Levels: 4 < 2 < 1 < 3 b <- order(a) # Define "x" order that match to order in "y". [1] 4 6 7 1 2 5 3 8 9 x[b] # Reorder "x" according to order in "y". [1] 4 4 4 2 2 1 3 3 3 

循环y并移动X中的所有匹配值以更正位置。