颠倒向量中重复节的顺序

时间:2015-09-22 23:58:05

标签: r

考虑以下预先排序的向量x

x <- c(1, 2, 2, 2, 3, 5, 7, 7, 7, 8)

order()向我们展示了矢量的顺序。

( o <- order(x) )
# [1]  1  2  3  4  5  6  7  8  9 10

现在假设我想要反转x的重复/重复值的顺序,这意味着我只想反转2 3 4的{​​{1}}和7 8 9部分因为这些是o中重复的值。然后,所需的结果将是

x

最好的方法是什么?现在我有以下

[1]  1  4  3  2  5  6  9  8  7 10

但这并没有给出正确答案。

w <- which(duplicated(x) | duplicated(x, fromLast = TRUE))
o[w] <- rev(o[w])

PS - 我使用它来反转重复列名的列顺序。

2 个答案:

答案 0 :(得分:15)

使用data.table v1.9.6

require(data.table)
as.data.table(x)[, .(id = rev(.I)), by=x]
#     x id
#  1: 1  1
#  2: 2  4
#  3: 2  3
#  4: 2  2
#  5: 3  5
#  6: 5  6
#  7: 7  9
#  8: 7  8
#  9: 7  7
# 10: 8 10

或者,您可以这样做:

order(x + sort(runif(length(x)), dec=TRUE))
#  [1]  1  4  3  2  5  6  9  8  7 10

(不完全确定是否存在可能破坏的情况)

答案 1 :(得分:12)

基础R 1-liner将使用ave按原始向量中的唯一值对排序进行分组,应用rev来反转每个组的排序:

ave(order(x), x, FUN=rev)
# [1]  1  4  3  2  5  6  9  8  7 10