考虑以下预先排序的向量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 - 我使用它来反转重复列名的列顺序。
答案 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