[R] Testing if all elements are equal in a vector/matrix

baptiste auguie baptiste.auguie at gmail.com
Tue Jun 16 14:58:03 CEST 2009


utkarshsinghal wrote:
> Hi Jim,
>
> What you are saying is correct. Although, my computer might not have 
> same speed and I am getting the following for 10M entries:
>
>    user  system elapsed
>   0.559   0.038   0.607
>
> Moreover, in the case of character vectors, it gets more than double.
>
> In my modeling, which is already highly time consuming,  I need to do 
> check this for few thousand vectors and the entries can easily be 10M in 
> each vector. So I am just looking for any possibilities of time saving.  
> I am pretty sure that whenever elements are not all equal, it can be 
> concluded from any few entries (most of the times). It will be worth if 
> I can find a way which stops checking further the moment it find two 
> distinct elements.
>   

*very* naively, you could define a tunable length to test only the first 
few lines of each vector first. It's probably only useful if you have a 
good guess on the likelihood of non-identity within the first n entries,


testTwoStages <- function(x= 1:10, y= rep(1,100), head.stop = 3){

if(!isTRUE(all(head(x, head.stop) == head(y, head.stop))))
{
    print(paste("quick test returned FALSE"))
    return(FALSE)
} else {
    print(paste("full test returned FALSE"))
   
    return(identical(tail(x, length(x) - head.stop), tail(y, length(y) - 
head.stop)))}

}

x <- seq(1, 1e6)
y <- x
y[325] <- 0

 > system.time(testTwoStages(x, y))
[1] "full test returned FALSE"
   user  system elapsed
  0.128   0.072   0.204
 > system.time(testTwoStages(x, y, 400))
[1] "quick test returned FALSE"
   user  system elapsed
  0.006   0.001   0.008


HTH,

baptiste



> Regards
> Utkarsh
>
>
> jim holtman wrote:
>   
>> Just check that the first (or any other element) is equal to all the rest:
>>  
>>     
>>> x = c(1,2,rep(1,10000000)) # 10,000,000
>>> system.time(print(all(x[1] == x)))
>>>       
>> [1] FALSE
>>    user  system elapsed
>>    0.18    0.00    0.19
>>
>>     
>> This was for 10M entries.
>>
>> On Tue, Jun 16, 2009 at 7:42 AM, utkarshsinghal 
>> <utkarsh.singhal at global-analytics.com 
>> <mailto:utkarsh.singhal at global-analytics.com>> wrote:
>>
>>
>>     Hi All,
>>
>>     There are several replies to the question below, but I think there
>>     must
>>     exist a  better way of doing so.
>>     I just want to check whether all the elements of a vector are same. My
>>     vector has one million elements and it is highly likely that there are
>>     distinct elements in the first few itself. For example:
>>
>>      > x = c(1,2,rep(1,100000))
>>
>>     I want the answer as FALSE, which is clear from the first two
>>     observations itself and we don't need to check for the rest.
>>
>>     Does anybody know the most efficient way of doing this?
>>
>>     Regards
>>     Utkarsh
>>
>>
>>
>>     From: Francisco J. Zagmutt <gerifalte28_at_hotmail.com
>>     <http://gerifalte28_at_hotmail.com/>
>>     <mailto:gerifalte28_at_hotmail.com
>>     <mailto:gerifalte28_at_hotmail.com>?Subject=Re:%20%5BR%5D%20Testing%20if%20all%20elements%20are%20equal%20in%20a%20vector/matrix>>
>>
>>     Date: Tue 30 Aug 2005 - 06:05:20 EST
>>
>>
>>     Hi Doran
>>
>>     The documentation for isTRUE reads 'isTRUE(x)' is an abbreviation of
>>     'identical(TRUE,x)' so actually Vincent's solutions is "cleaner" than
>>     using identical :)
>>
>>     Cheers
>>
>>     Francisco
>>
>>     />From: "Doran, Harold" <HDoran at air.org <mailto:HDoran at air.org>> /
>>     />To: <vincent.goulet at act.ulaval.ca
>>     <mailto:vincent.goulet at act.ulaval.ca>>, <r-help at stat.math.ethz.ch
>>     <mailto:r-help at stat.math.ethz.ch>> /
>>     />Subject: Re: [R] Testing if all elements are equal in a
>>     vector/matrix /
>>     />Date: Mon, 29 Aug 2005 15:49:20 -0400 /
>>     /> /
>>      >See ?identical
>>     <http://tolstoy.newcastle.edu.au/R/help/05/08/11201.html#11202qlink1>
>>     /> /
>>     />-----Original Message----- /
>>     />From: r-help-bounces at stat.math.ethz.ch
>>     <mailto:r-help-bounces at stat.math.ethz.ch> /
>>     />[mailto:r-help-bounces at stat.math.ethz.ch
>>     <mailto:r-help-bounces at stat.math.ethz.ch>] On Behalf Of Vincent
>>     Goulet /
>>     />Sent: Monday, August 29, 2005 3:35 PM /
>>     />To: r-help at stat.math.ethz.ch <mailto:r-help at stat.math.ethz.ch> /
>>     />Subject: [R] Testing if all elements are equal in a vector/matrix /
>>     /> /
>>     /> /
>>     />Is there a canonical way to check if all elements of a vector or
>>     matrix are /
>>     />the same? Solutions below work, but look hackish to me. /
>>     /> /
>>     /> > x <- rep(1, 10) /
>>     /> > all(x == x[1]) # == operator does not provide for small
>>     differences /
>>     */>[1] TRUE /
>>     */> > isTRUE(all.equal(x, rep(x[1], length(x)))) # ugly /
>>     */>[1] TRUE /
>>     */> /
>>     />Best, /
>>     /> /
>>     />Vincent /
>>     />-- /
>>     /> Vincent Goulet, Associate Professor /
>>     /> École d'actuariat /
>>     /> Université Laval, Québec /
>>     /> Vincent.Goulet_at_act.ulaval.ca
>>     <http://vincent.goulet_at_act.ulaval.ca/>
>>     <mailto:Vincent.Goulet_at_act.ulaval.ca
>>     <mailto:Vincent.Goulet_at_act.ulaval.ca>?Subject=Re:%20%5BR%5D%20Testing%20if%20all%20elements%20are%20equal%20in%20a%20vector/matrix>
>>     http://vgoulet.act.ulaval.ca <http://vgoulet.act.ulaval.ca/> /
>>     /> /
>>     />______________________________________________ /
>>     />R-help at stat.math.ethz.ch <mailto:R-help at stat.math.ethz.ch>
>>     mailing list /
>>     />https://stat.ethz.ch/mailman/listinfo/r-help /
>>     />PLEASE do read the posting guide! /
>>     />http://www.R-project.org/posting-guide.html
>>     <http://www.r-project.org/posting-guide.html> /
>>     /> /
>>     />______________________________________________ /
>>     />R-help at stat.math.ethz.ch <mailto:R-help at stat.math.ethz.ch>
>>     mailing list /
>>     />https://stat.ethz.ch/mailman/listinfo/r-help /
>>     />PLEASE do read the posting guide! /
>>     />http://www.R-project.org/posting-guide.html
>>     <http://www.r-project.org/posting-guide.html> /
>>
>>            [[alternative HTML version deleted]]
>>
>>
>>     ______________________________________________
>>     R-help at r-project.org <mailto: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
>>     <http://www.r-project.org/posting-guide.html>
>>     and provide commented, minimal, self-contained, reproducible code.
>>
>>
>>
>>
>> -- 
>> Jim Holtman
>> Cincinnati, OH
>> +1 513 646 9390
>>
>> What is the problem that you are trying to solve?
>>     
>
>
> 	[[alternative HTML version deleted]]
>
>   
> ------------------------------------------------------------------------
>
> ______________________________________________
> 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.
>   


-- 
_____________________________

Baptiste Auguié

School of Physics
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag




More information about the R-help mailing list