我有一个向量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)
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)
您可以转换x为有序因子:
x.factor <- factor(x, levels = y, ordered=TRUE)
sort(x)
sort(x.factor)
Run Code Online (Sandbox Code Playgroud)
显然,将数字更改为因子可以从根本上改变下游代码对x. 但是由于您没有向我们提供有关接下来会发生什么的任何背景信息,我想我会建议将其作为一种选择。
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
重要步骤:
for(i in y) -- 循环感兴趣的元素。
z <- c(z, ...) -- 依次连接每个子表达式
rep(i, sum(x==i)) -- 重复 i(当前感兴趣的元素) sum(x==i) 次(我们在 x 中找到 i 的次数)。