Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何根据另一个向量的值对一个向量进行排序_Sorting_R - Fatal编程技术网

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

Sorting 如何根据另一个向量的值对一个向量进行排序,sorting,r,Sorting,R,我有一个向量x,我想根据向量y中值的顺序来排序。这两个向量的长度不同 x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3) y <- c(4, 2, 1, 3) x您可以将x转换为有序因子: x.factor <- factor(x, levels = y, ordered=TRUE) sort(x) sort(x.factor) x.factor[编辑:显然伊恩的方法是正确的,但我将把这个留给子孙后代。] 通过在y向量上建立索引,可以在没有循环的情况下实现这

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

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

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

x.factor <- factor(x, levels = y, ordered=TRUE)
sort(x)
sort(x.factor)
x.factor[编辑:显然伊恩的方法是正确的,但我将把这个留给子孙后代。]

通过在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怎么样

rep(y,table(x)[as.character(y)])
(伊恩的可能更好)

这个怎么样

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

如果您需要在“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

a您还可以使用
sqldf
并通过
sql
中的
join
函数来执行,如下所示:

library(sqldf)
x <- data.frame(x = c(2, 2, 3, 4, 1, 4, 4, 3, 3))
y <- data.frame(y = c(4, 2, 1, 3))

result <- sqldf("SELECT x.x FROM y JOIN x on y.y = x.x")
ordered_x <- result[[1]]
库(sqldf)

x这是最简单的方法-获得最多选票的答案使用顺序函数,这是不必要的:

x[match(x,y)]

这是非常好的,比公认的答案IMHO更好,因为它更一般。我甚至可以说这应该是在基本GNU-R中。这个答案对我来说在使用x和y的字符向量时效果很好。在接受的答案中添加一个分解/轻微的细化会更好,你不需要在那里排序,匹配是足够的,这应该是最好的答案,因为它适用于非整数情况;或者在排序向量
y
中没有值的情况下也可以工作,但略有变化:
x
library(sqldf)
x <- data.frame(x = c(2, 2, 3, 4, 1, 4, 4, 3, 3))
y <- data.frame(y = c(4, 2, 1, 3))

result <- sqldf("SELECT x.x FROM y JOIN x on y.y = x.x")
ordered_x <- result[[1]]
x[match(x,y)]