我正在尝试根据给定的序列来组织数据序列。例如,我给定的序列是
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)位于第一或第六位。
我可以看到组织的序列不是唯一的,但是我不确定如何做到这一点。
答案 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
。幸运的是,两次调用顺序只会使其顺序化。