我有一个任务,其中我有一个带标签的数字向量,比如大小为5并标记a,b,c,d,e,我需要对其进行排序,然后以(反向)排序顺序打印标签。因此,例如,在输入中给出此向量v1:
a b c d e
1 -3 -1 10 5 -15
所需的输出为:cdbae。
现在,困难的部分是处理关系。如果出现平局,我需要打印所有可能的订单。因此,例如,在输入中给出另一个向量v2:
a b c d e
1 10 29 10 10 -15
排序后我们有:
b a c d e
1 29 10 10 10 -15
但当然我们有3! = 6
种可能的排列。我想打印这个数组:
v <- c("bacde", "badce", "bcade", "bcdae", "bdcae", "bdace").
如果这有帮助,标签的数量永远不会超过10,所以我不介意与此相关的表现。
答案 0 :(得分:2)
这样做。但我不建议在数据集太多的情况下运行。
require(gregmisc)
x <- c(a=10, b=29, c=10, d=10, e=-15)
y <- sort(x, decreasing=T)
if (any(duplicated(y))) {
o <- sapply(unique(y), function(val) {
m <- names(y[y==val])
# just to make things quicker using length(m)
if (length(m) <= 1) {
return(m)
}
do.call(paste0, as.data.frame(permutations(length(m), length(m), m)))
})
out <- do.call(paste0, expand.grid(o))
} else {
out <- paste(names(y), collapse="")
}
# [1] "bacde" "badce" "bcade" "bcdae" "bdace" "bdcae"
当然它也处理多个关系。继续:
x <- c(a=10, b=29, c=10, d=-10, e=35, f=-10, g=10)
y <- sort(x, decreasing = TRUE)
给出:
# [1] "ebacgdf" "ebagcdf" "ebcagdf" "ebcgadf" "ebgacdf" "ebgcadf" "ebacgfd" "ebagcfd"
# [9] "ebcagfd" "ebcgafd" "ebgacfd" "ebgcafd"