在排序中打印所有可能的联系

时间:2013-02-05 08:01:20

标签: r sorting

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

1 个答案:

答案 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"