[R] vector comparison

Jim Lemon jim at bitwrit.com.au
Fri Jun 6 11:54:13 CEST 2008


Karin Lagesen wrote:
> I know this is fairly basic, but I must have somehow missed it in the
> manuals.
> 
> I have two vectors, often of unequal length. I would like to compare
> them for identity. Order of elements do not matter, but they should
> contain the same.
> 
> I.e: I want this kind of comparison:
> 
> 
>>if (1==1) show("yes") else show("blah")
> 
> [1] "yes"
> 
>>if (1==2) show("yes") else show("blah")
> 
> [1] "blah"
> 
> 
> Only replace the numbers with for instance the vectors 
> 
> 
>>a = c("a")
>>b = c("b","c")
>>c = c("c","b")
> 
> 
> 
> Now, I realize I only get a warning when comparing things, but this to
> me means that I am not doing it correctly:
> 
> 
>>if (a==a) show("yes") else show("blah")
> 
> [1] "yes"
> 
>>if (a==b) show("yes") else show("blah")
> 
> [1] "blah"
> Warning message:
> In if (a == b) show("yes") else show("blah") :
>   the condition has length > 1 and only the first element will be used
> 
>>if (b == c) show("yes") else show("blah")
> 
> [1] "blah"
> Warning message:
> In if (b == c) show("yes") else show("blah") :
>   the condition has length > 1 and only the first element will be used
> 
> 
> I have also tried the %in% comparator, but that one throws warnings too:
> 
> 
>>if (b %in% c) show("yes") else show("blah")
> 
> [1] "yes"
> Warning message:
> In if (b %in% c) show("yes") else show("blah") :
>   the condition has length > 1 and only the first element will be used
> 
>>if (c %in% c) show("yes") else show("blah")
> 
> [1] "yes"
> Warning message:
> In if (c %in% c) show("yes") else show("blah") :
>   the condition has length > 1 and only the first element will be used
> 
> 
> So, how is this really supposed to be done?
> 
Hi Karin,
My interpretation of your question is that you want to test whether two 
vectors contain the same elements, whether or not the order of those 
elements is the same. I'll first assume that the vectors must only have 
elements from the same _set_ and it doesn't matter if they have 
different lengths.

if(length(unique(a))==length(unique(b))) {
  if(all(unique(a)==unique(b))) cat("Yes\n")
  else cat("No\n")
}
else cat("No\n")

However, if the lengths must be the same, but the order may be different:

if(length(a)==length(b)) {
  if(all(sort(a)==sort(b))) cat("Yes\n")
  else cat("No\n")
}
else cat("No\n")

The latter test ensures that if there are repeated elements, the number 
of repeats of each element is the same in each vector.

Jim



More information about the R-help mailing list