如何根据R中的给定序列对向量排序

时间:2018-12-21 19:17:39

标签: r sorting random

我正在尝试根据给定的序列来组织数据序列。例如,我给定的序列是

set.seed(1)
given_seq <- sample(rep(1:3,2))

数据及其相关顺序

dat_seq <- rep(1:3,2)
dat_value <- rnorm(6)

我想根据给定的顺序组织数据。也就是说,1,2,3充当数据标签的功能。例如,

dat_value
[1]  1.5952808  0.3295078 -0.8204684  0.4874291  0.7383247  0.5757814

dat_seq
[1] 1 2 3 1 2 3

given_seq
[1] 2 3 3 1 1 2

然后我希望第二个和第五个数据值(带有标签2)位于第一或第六位。

我可以看到组织的序列不是唯一的,但是我不确定如何做到这一点。

3 个答案:

答案 0 :(得分:2)

这是另一种选择:

dat_value[match(rank(given_seq, ties = "random"), rank(dat_seq, ties = "random"))]
# [1]  0.7383247  0.5757814 -0.8204684  1.5952808  0.4874291  0.3295078

首先,我们将两个序列转换为没有重复元素的序列;例如,

rank(given_seq, ties = "random")
# [1] 3 5 6 1 2 4

也就是说,如果given_seq的两个条目为(1,1),则它们将被随机转换为(1,2)或(2,1)。 dat_seq的操作也是如此,因此,我们可以匹配它们并相应地对dat_value重新排序。因此,这种方法将为您提供一些随机性,这在您的应用程序中可能是不希望有的。

答案 1 :(得分:1)

我只是使标签唯一,然后正常使用names属性。

names(dat_value) = make.unique(as.character(dat_seq))
dat_value[make.unique(as.character(given_seq))]
 #         2          3        3.1          1        1.1        2.1 
 # 0.3295078 -0.8204684  0.5757814  1.5952808  0.4874291  0.7383247 

如果非唯一性不适用于您的用例,您以后可以随时删除名称。

答案 2 :(得分:1)

这也可以,甚至可能更快,尽管可能很难理解

dat_value[order(dat_seq)][order(order(given_seq))]

首先,我们对dat_value重新排序,使其与序列c(1,1,2,2,3,3)相对应。
然后我们继续执行所需的顺序,如果顺序是given_seq。幸运的是,两次调用顺序只会使其顺序化。