[R] changing a range of values

David Winsemius dwinsemius at comcast.net
Sat Jan 17 18:37:34 CET 2009


 > x <- c(1,1,1,2,2,3,4,4,5)
 > x[x %in% 1:3]
[1] 1 1 1 2 2 3

So ...
 > x[x %in% 1:3] <- 1

 > x
[1] 1 1 1 1 1 1 4 4 5


On Jan 17, 2009, at 12:03 PM, Jörg Groß wrote:

> Hi,
>
>
> If I have following vector;
>
>
> x <- c(1,1,1,2,2,3,4,4,5)
>
> and I want to change values in the range of 1 to 3 into the value 1,  
> how can I do that?
>
>
> I tried
>
>
> x[x == c(1:3)] <- c(1)
>
>
> but than I get;
>
> x
> [1] 1 1 1 2 1 1 4 4 5
>
>
>
> R doesn't change the 2 into a 1.
> But why?

It appears to be the result of with argument recycling. If you change  
the problem to one where the length of x is not a multiple of the  
other side of the equality, you get a warning that is typical for that  
sort of problem:

 > x <- c(1,1,1,2,2,3,3,3,4,4,5)
 >
 >
 >
 > x[x == c(1:3)]
[1] 1 2 3
Warning message:
In x == c(1:3) :
   longer object length is not a multiple of shorter object length

 > x[x == c(1:3)] <- c(1)
Warning message:
In x == c(1:3) :
   longer object length is not a multiple of shorter object length
 >
 > x
  [1] 1 1 1 2 1 1 3 3 4 4 5

I think it is testing these equalities with the matches having a up- 
caret.
  1 1 1 2 2 3 3 3 4 4 5
  1 2 3 1 2 3 1 2 3 1 2
        ^   ^

-- 
David Winsemius

>
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.




More information about the R-help mailing list