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 に答える