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

如何根据R中给定的序列对向量进行排序,r,sorting,random,R,Sorting,Random,我试图根据给定的顺序组织一系列数据。例如,给定的序列是 set.seed(1) given_seq <- sample(rep(1:3,2)) 然后我希望第二和第五个数据值(带标签2)放在第一或第六位 我可以看到组织的序列不是唯一的,但我不确定如何做到这一点。我只会使标签唯一,并正常使用名称属性 names(dat_value) = make.unique(as.character(dat_seq)) dat_value[make.unique(as.character(given_se

我试图根据给定的顺序组织一系列数据。例如,给定的序列是

set.seed(1)
given_seq <- sample(rep(1:3,2))
然后我希望第二和第五个数据值(带标签2)放在第一或第六位


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

我只会使标签唯一,并正常使用
名称
属性

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 

如果非唯一性对您的用例不起作用,您可以在以后删除名称。

我只会使标签唯一,并正常使用
名称属性

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 

如果非唯一性对您的用例不起作用,您可以在以后删除名称。

这也起作用,可能更快,尽管可能更难理解

dat_value[order(dat_seq)][order(order(given_seq))]
首先,我们对dat_值重新排序,使其对应于序列
c(1,1,2,2,3,3)


然后我们选择所需的顺序,如果顺序是连续的,它将是给定的。幸运的是,两次调用order只会使它按顺序进行。

这同样有效,可能更快,尽管它可能更难理解

dat_value[order(dat_seq)][order(order(given_seq))]
首先,我们对dat_值重新排序,使其对应于序列
c(1,1,2,2,3,3)

然后我们选择所需的顺序,如果顺序是连续的,它将是给定的。幸运的是,两次调用order只会使它按顺序进行。

这里有另一个选项:

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
首先,我们将两个序列转换为没有重复元素的序列;e、 g

rank(given_seq, ties = "random")
# [1] 3 5 6 1 2 4
也就是说,如果给定的两个
条目是(1,1),那么它们将随机转换为(1,2)或(2,1)。对
dat_seq
也是如此,因此,我们可以匹配它们并相应地重新排序
dat_值。因此,这种方法会给你一些随机化,这在你的应用程序中可能是或可能不是理想的选择。

这里有另一个选择:

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
首先,我们将两个序列转换为没有重复元素的序列;e、 g

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

也就是说,如果给定的两个
条目是(1,1),那么它们将随机转换为(1,2)或(2,1)。对
dat_seq
也是如此,因此,我们可以匹配它们并相应地重新排序
dat_值。因此,这种方法会给你一些随机性,这在你的应用中可能是或可能不是理想的。

新的
dat\u值顺序的预期结果是什么?@Nate我刚刚编辑了这个问题。谢谢对于非唯一标签来说,这似乎真的很奇怪。如果标签是唯一的,则可以轻松使用
名称
属性,但如果没有唯一的标签,则可能需要构建自己的方法。当您“期望第二和第五个数据值(带标签2)位于第一或第六位”时,您是否期望第二和第五个数据值必须与第一和第六个数据值相对应?还是可以成为第六名和第一名?如果第2个在第1个和第6个重复,第5个不见了,可以吗?@Gregor是的,我同意这有点奇怪。也许我不该用这个词来形容这个问题。是的,第六名和第一名是可以的,但任何一个都不能错过。新的
dat\u值顺序的预期结果是什么?@Nate我刚刚编辑了这个问题。谢谢对于非唯一标签来说,这似乎真的很奇怪。如果标签是唯一的,则可以轻松使用
名称
属性,但如果没有唯一的标签,则可能需要构建自己的方法。当您“期望第二和第五个数据值(带标签2)位于第一或第六位”时,您是否期望第二和第五个数据值必须与第一和第六个数据值相对应?还是可以成为第六名和第一名?如果第2个在第1个和第6个重复,第5个不见了,可以吗?@Gregor是的,我同意这有点奇怪。也许我不该用这个词来形容这个问题。是的,第六名和第一名是可以的,但任何一个都不能错过。这允许随机化,正是我所需要的。这允许随机化,正是我所需要的。
order(order(给定的顺序))
真的很聪明<代码>顺序(顺序(给定的顺序))
真聪明!