2

我有一个任务,我有一个带标签的数字向量,比如大小为 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 个,所以我不介意与此相关的性能。

4

1 回答 1

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"
于 2013-02-05T08:33:19.207 回答