[R] delete data row

David Winsemius dwinsemius at comcast.net
Mon Oct 18 01:38:35 CEST 2010


On Oct 17, 2010, at 3:56 PM, William Dunlap wrote:

>
>> I had been thinking of:
>>> x <- c(1, (2^(0.5))^2 , 3, 5, (2^(0.5))^2 , 3, 1)
>>> y <- 2
>>> x[-which(zapsmall(x-y) == 0)]
>> [1] 1 3 5 3 1
>
> Using which() to convert logicals into integer
> subscripts is almost always unnecessary and often wrong.

At one time I believed that too. However, in the situation where the  
test produces NA rather than a numeric value  when one is indexing in  
the first argument. I have had the unpleasant experience of pages if  
useless and frustrating to understand output because of this "feature".

I learned to either use which() in the first argument to "[" or to use  
subset to avoid inadvertent "returns" from logical indexing.

 > x <- 1:10
 > y <- log(x-5)
Warning message:
In log(x - 5) : NaNs produced
 > x[y>-Inf]
[1] NA NA NA NA  6  7  8  9 10

 > x[which(y>-Inf)]
[1]  6  7  8  9 10

If that test were used in a dataframe indexing, the entire line might  
come back as a "result".



> In this case it fails when no x is close to y,
> because integer(0) is the same thing as -integer(0):
>
>> x[-which(zapsmall(x-10) == 0)]
>  numeric(0)
>
> The whichless version, using logical subscripts,
> works (in this case we want all of x):
>
>> x[zapsmall(x-10)!=0]
>  [1] 1 2 3 5 2 3 1

Maybe the rule should be don't use the -which construction:

 > x <- c(1, (2^(0.5))^2 , 3, 5, (2^(0.5))^2 , 3, 1)
 > y <- 2
 > x[which(zapsmall(x-10) != 0)]
[1] 1 2 3 5 2 3 1

-- 
David.
>
> When using logicals as subscripts, read the "["
> as "such that".
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com



More information about the R-help mailing list