5

c(1, 2, 3, 3, 2, 1, 3)またはなどの数値ベクトルがあり、c(1, 4, 1, 4, 4, 1)個々の要素の位置を保持したいのですが、値を入れ替え/反転してc(3, 2, 1, 1, 2, 3, 1)c(4, 1, 4, 1, 1, 4)それぞれを取得します。

それを達成するために、私はたくさんのデバッグとパッチを適用した、かなりラフで醜いコードを以下に思いつきました...

blah <- c(1, 4, 1, 4, 4, 1, 3)
blah.uniq <- sort(unique(blah))
blah.uniq.len <- length(blah.uniq)
j <- 1
end <- ceiling(blah.uniq.len / 2)
if(end == 1) {end <- 2} # special case like c(1,4,1), should get c(4,1,4) 
for(i in blah.uniq.len:end) {
  x <- blah == blah.uniq[i]
  y <- blah == blah.uniq[j]
  blah[x] <- blah.uniq[j]
  blah[y] <- blah.uniq[i]
  j = j + 1
}
blah

これを行う簡単な方法はありますか?

4

3 に答える 3

12

スコアを逆にしようとしていると思います。アルゴリズムは(1 + max(x_i))-x_i

それで...

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

(max(x, na.rm=T) + 1) - x
(max(y, na.rm=T) + 1) - y

降伏:

> (max(x, na.rm=T) + 1) - x
[1] 3 2 1 1 2 3 1
> (max(y, na.rm=T) + 1) - y
[1] 4 1 4 1 1 4

OPのコメントによると:

rev.score <- function(x) {
    h <- unique(x)
    a <- seq(min(h, na.rm=T), max(h, na.rm=T))
    b <- rev(a)
    dat <- data.frame(a, b)
    dat[match(x, dat[, 'a']), 2]
}

x <- c(1, 2, 3, 3, 2, 1, 3)
rev.score(x)
y <- c(1, 4, 1, 4, 4, 1)
rev.score(y)
z <- c(1, 5, 10, -3, -5, 2)
rev.score(z)
于 2012-11-14T04:17:04.017 に答える
6

おめでとう!あなたはついにfactorsの使用法を見つけたかもしれません、私はまだ1つを探していました:-)

x <- c(1, 2, 3, 3, 2, 1, 3)
# [1] 1 2 3 3 2 1 3
y <- factor(x)
# [1] 1 2 3 3 2 1 3
# Levels: 1 2 3
levels(y) <- rev(levels(y))
# [1] 3 2 1 1 2 3 1
# Levels: 3 2 1

そのアイデアに基づいて構築された、入力と同じクラスのオブジェクトを返す関数を次に示します。

swap <- function(x) {
    f <- factor(x)
    y <- rev(levels(f))[f]
    class(y) <- class(x)
    return(y)
}
swap(c(1, 2, 3, 3, 2, 1, 3))
# [1] 3 2 1 1 2 3 1
swap(c(1, 4, 1, 4, 4, 1))
# [1] 4 1 4 1 1 4
于 2012-11-14T12:29:31.120 に答える
5

可能な一般化可能な関数。

revscore <- function(x) {
  rx <- min(x):max(x)
  rev(rx)[sapply(1:length(x), function(y) match(x[y],rx))]
}

x1 <- c(-3,-1,0,-2,3,2,1)
x2 <- c(-1,0,1,2)
x3 <- 1:7

いくつかのテスト:

> x1
[1] -3 -1  0 -2  3  2  1
> revscore(x1)
[1]  3  1  0  2 -3 -2 -1

> x2
[1] -1  0  1  2
> revscore(x2)
[1]  2  1  0 -1

> x3
[1] 1 2 3 4 5 6 7
> revscore(x3)
[1] 7 6 5 4 3 2 1
于 2012-11-14T06:08:40.733 に答える