[R] when use which()
William Dunlap
wdunlap at tibco.com
Fri Nov 13 22:13:13 CET 2009
> -----Original Message-----
> From: r-help-bounces at r-project.org
> [mailto:r-help-bounces at r-project.org] On Behalf Of
> soeren.vogel at eawag.ch
> Sent: Friday, November 13, 2009 12:24 PM
> To: r-help at r-project.org
> Subject: [R] when use which()
>
> Hello:
>
> # some code to assign with and without "which"
> q <- 1:20; q[c(9, 12, 14)] <- NA
> r <- 1:20; r[c(8:9, 12:15)] <- NA
> s <- 1:20; s[c(8:9, 12:15)] <- NA
> r[q < 16] <- 0
> s[which(q < 16)] <- 0
> r;s # both: 0 0 0 0 0 0 0 0 NA 0 0 NA 0 NA 0 16 17 18 19 20
> r <- 1:20; r[c(8:9, 12:15)] <- NA
> s <- 1:20; s[c(8:9, 12:15)] <- NA
> r[is.na(q)] <- 30
> s[which(is.na(q))] <- 30
> r;s # both: 1 2 3 4 5 6 7 NA 30 10 11 30 NA 30 NA 16 17 18 19 20
>
> So it appears to me that "a[b] <- c" delivers the same results as
> a[which(b)] <- c". Is there any situation where the assignment with/
> out which indeed makes a difference?
When using "[" there should be no difference between
using x[condition] and x[which(condition)]. which() is
just a waste of typing, cpu time, and memory there.
If you want all x that don't satisfy the condition
x[!condition] works but x[-which(condition)]
silently gives the wrong answer when all(condition==FALSE).
There is one weird case, in [[, not [, where there is a
difference, and this might be considered a bug:
> list(a=10,b=20,c=30)[[c(FALSE,TRUE,FALSE)]]
Error in list(a = 10, b = 20, c = 30)[[c(FALSE, TRUE, FALSE)]] :
attempt to select less than one element
> list(a=10,b=20,c=30)[[which(c(FALSE,TRUE,FALSE))]]
[1] 20
[[ is treating the vector of logicals as a vector of integers
and it can only work if all of them are TRUE and the list has
at least 3 levels of recursion
> list(list(list(10,20),list(30,40)))[[c(TRUE,TRUE,TRUE)]]
[1] 10
Of course, someone can write a package that defines a method for
[ that doesn't work this way, but that would be unfriendly.
Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
>
> Thanks for help
>
> Regards
>
> Sören
>
> ______________________________________________
> 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