which() does not handle NAs in named vectors. (PR#226)

About this list Date view Thread view Subject view Author view Other groups

Subject: which() does not handle NAs in named vectors. (PR#226)
ripley@stats.ox.ac.uk
Date: Thu 15 Jul 1999 - 17:14:46 EST


Message-Id: <199907150714.JAA03804@pubhealth.ku.dk>

Version:
 platform = sparc-sun-solaris2.6
 arch = sparc
 os = solaris2.6
 system = sparc, solaris2.6
 status =
 status.rev = 0
 major = 0
 minor = 64.2
 year = 1999
 month = July
 day = 3
 language = R

-- It is unclear to me that the handling of NAs is desirable, and it
   has problems with names:

> z <- c(T,T,NA,F,T)
> names(z) <- letters[1:5]
> which(z)
Error: names attribute must be the same length as the vector
      
(Why do the vector and its names have different subscripts? And while
you are correcting this,

Arguments:

       x: a logical vector or array. `NA's are allowed an
          omitted.
  
has a typo, and the logic can be simplified: see below.)

On Thu, 15 Jul 1999, Martin Maechler wrote:

> >>>>> "BDR" == Prof Brian D Ripley <ripley@stats.ox.ac.uk> writes:
>
> BDR> On Wed, 14 Jul 1999, Friedrich Leisch wrote:
> >> >>>>> On Wed, 14 Jul 1999 04:09:21, >>>>> Peter B Mandeville (PBM)
> >> wrote:
> >>
> PBM> I have a vector Pes with 600 elements some of which are NA's. How
> PBM> can I form a vector of the indices of the NA's.
> >>
> PBM> for(i in 1:600) if(is.na(Pes[i])) print(i)
> >>
> PBM> prints the indices of the NA's but I can't figure out how to put
> PBM> the results in a vector.
> >> try this:
> >>
> >> x <- (1:length(Pes))[is.na(Pes)]
>
> BDR> Tip: that sort of thing often fails for a length 0 vector. The
> BDR> `approved' spell is
>
> BDR> seq(along=Pes)[is.na(Pes)]
>
> BDR> In this case it does not matter as the subscript is of length 0,
> BDR> but it has floored enough library/package writers to be worth
> BDR> thinking about.
>
> Good teaching about seq() vs. 1:n
>
> However, the solution I gave
>
> which(is.na(Pes))
>
> is the one I stilly really recommend;
> it does deal with 0-length objects, and it keeps names when there are some,
> and it has an `arr.ind = FALSE' argument to return array indices instead of
> vector indices when so desired.

Yes, but

-- It is not in S (so causing difficulty in porting from R to S)
-- It looks a relatively expensive operation.
-- Internally which could be simplified by using seq(along=) as it
   is a wrapper for this construct, but actually the separate
   handling of n == 0 is unnecessary (as logic & !is.na(logic) will have
   length zero.)

Brian

-- 
Brian D. Ripley,                  ripley@stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272860 (secr)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


About this list Date view Thread view Subject view Author view Other groups

This archive was generated by hypermail 2b25 : Tue 04 Jan 2000 - 14:16:06 EST