Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reverse score a vector

Tags:

r

numeric

I have numeric vectors, such as c(1, 2, 3, 3, 2, 1, 3) or c(1, 4, 1, 4, 4, 1), and I would like to keep individual element's position, but swap/reverse the value, so that we get c(3, 2, 1, 1, 2, 3, 1), c(4, 1, 4, 1, 1, 4) respectively.

To achieve that, I came up with a rather rough and ugly code below with lots of debugging and patching...

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

Is there an easier way to do this?

like image 952
Antony Avatar asked Nov 14 '12 04:11

Antony


People also ask

How do you reverse a score?

To reverse score, we take 7 + 1 = 8, and subtract our scores from that. 8 - 7 = 1, 8 - 1 = 7. Voila.

What does it mean when items are reverse scored?

The aim of reverse scoring is to re-code the responses so that a high score is transformed into the corresponding low score on the scale. For example, in a 5-point scale, a 4 is transformed into a 2, and vice-versa.

How do you reverse data in R?

The rev() method in R is used to return the reversed order of the R object, be it dataframe or a vector. It computes the reverse columns by default. The resultant dataframe returns the last column first followed by the previous columns.


1 Answers

I think you're trying to reverse score. The algorithm is (1 + max(x_i)) - x_i

so...

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

yielding:

> (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

Per the OP's comment:

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)
like image 191
Tyler Rinker Avatar answered Oct 11 '22 14:10

Tyler Rinker