1

数値の行列を取得しました:

x<-c(1,1,1,1,2,2,2,3,3,4)

次のようなバージョンが必要です。

x<-c(4,4,4,4,3,3,3,2,2,1)

これは、最初の配列の反転バージョンです。おそらくブルートフォースループ以外にこれを取得する効率的な方法はありますか?

4

7 に答える 7

8

との組み合わせでうまくrepいきuniqueます。

> x<-c(1,1,1,1,2,2,2,3,3,4)
> y <- rev(unique(x)) # Reversing elements
> rep(y,y)  
 [1] 4 4 4 4 3 3 3 2 2 1

次のように使用することもできますrle

>z <- rev(rle(x)$values)
>rep(z, z)
 [1] 4 4 4 4 3 3 3 2 2 1

楽しみのために、また使用tableすると役立ちます

>y <- as.numeric(rev(names(table(x))))
>rep(y, y)
于 2013-07-16T14:30:25.770 に答える
8

楽しみのために、ここに別の方法があります (ただし、@Jilber のアプローチは私が最初に考えていたものでした)。

as.numeric(as.character(factor(x, labels = rev(unique(x)))))
# [1] 4 4 4 4 3 3 3 2 2 1
于 2013-07-16T14:34:29.197 に答える
6

を使用した別のアプローチを次に示します。rle

x <- c(2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,7,8,8,9)
myrle <- rle(x)
myrle$values <- rev(myrle$values)
inverse.rle(myrle)
[1] 9 9 9 9 9 9 9 9 8 8 8 8 8 8 8 7 7 7 7 7 7 6 6 6 6 6 5 5 5 5
[31] 4 4 4 3 3 2

@eddi の新しい例のように、データがソートされていない場合、データをソートしてから、基本的に同じアプローチを適用できます。

x <- c(1,1,1,2,2,1,1,5,5,3,3)
myrle <- rle(sort(x))
ind <- match(x, sort(x))
myrle$values <- rev(myrle$values)
inverse.rle(myrle)[ind]
[1] 5 5 5 3 3 5 5 1 1 2 2
于 2013-07-16T14:38:42.213 に答える
5

このアクションをミラーリングと解釈しましょう。

x<-c(1,1,1,1,2,2,2,3,3,4)

mirrorfun <- function(x, axis)  axis-(x-axis)

mirrorfun(x,mean(unique(x)))
#[1] 4 4 4 4 3 3 3 2 2 1

y<-c(2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,7,8,8,9)
mirrorfun(y,mean(unique(y)))
#[1] 9 9 9 9 9 9 9 9 8 8 8 8 8 8 8 7 7 7 7 7 7 6 6 6 6 6 5 5 5 5 4 4 4 3 3 2
于 2013-07-16T14:48:56.643 に答える