如何基于另一个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
重要步骤:
-
for(i in y) – 循环感兴趣的元素。
-
z < – c(z,…) – 依次连接每个子expression式
-
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中的所有匹配值以更正位置。