数値の行列を取得しました:
x<-c(1,1,1,1,2,2,2,3,3,4)
次のようなバージョンが必要です。
x<-c(4,4,4,4,3,3,3,2,2,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)
これは、最初の配列の反転バージョンです。おそらくブルートフォースループ以外にこれを取得する効率的な方法はありますか?
との組み合わせでうまく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)
楽しみのために、ここに別の方法があります (ただし、@Jilber のアプローチは私が最初に考えていたものでした)。
as.numeric(as.character(factor(x, labels = rev(unique(x)))))
# [1] 4 4 4 4 3 3 3 2 2 1
を使用した別のアプローチを次に示します。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
このアクションをミラーリングと解釈しましょう。
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