On Sun, 2005-04-17 at 19:13 +0200, Werner Wernersen
wrote:> Hi R friends!
>
> I am stuck with a stupid question: I can circumvent it
> but I would like to
> understand why it is wrong. It would be nice if you
> could give me a hint...
Having a reproducible example, as per the posting guide, would be
helpful here. We'll use a contrived example that hopefully explains what
I can only presume you are seeing.
> I have an 2D array d and do the following:
> ids <- which(d[,1]>0)
Here ids contains the indices of the values in the vector d[, 1] that
are > 0.
For example:
> d <- matrix(sample(0:1, 12, replace = TRUE), ncol = 2)
> d
[,1] [,2]
[1,] 1 1
[2,] 1 1
[3,] 0 1
[4,] 0 0
[5,] 0 1
[6,] 1 0
> ids <- which(d[, 1] > 0)
> ids
[1] 1 2 6
Note that c(1, 2, 6) are the indices into the vector:
> d[, 1]
[1] 1 1 0 0 0 1
of the values that are > 0.
> then I have a vector gk with same column size as d and
> do:
> ids2 <- which(gk[ids]==1)
Here ids2 contains the indices of the values in gk[ids] that equal 1.
> gk <- sample(0:1, 6, replace = TRUE)
> gk
[1] 1 1 1 0 1 1
> gk[ids] # same as gk[c(1, 2, 6)]
[1] 1 1 1
> ids2 <- which(gk[ids] == 1)
> ids2
[1] 1 2 3
All three of the values in gk[ids] == 1.
> but I can't interprete the result I get in ids2.
>
> I get the expected result when I use:
> which(gk==1 & d[,1]>0)
Here you are getting the result of logically comparing the two vectors:
> gk == 1
[1] TRUE TRUE TRUE FALSE TRUE TRUE
AND
> d[, 1] > 0
[1] TRUE TRUE FALSE FALSE FALSE TRUE
where the result of the comparison is the index value of each pair in
the two vectors where both values are TRUE.
Thus:
> which(gk == 1 & d[, 1] > 0)
[1] 1 2 6
versus:
> ids2
[1] 1 2 3
> Why is the first version wrong?
It's not wrong. It is giving you what you asked for.
Your question was wrong. :-)
> The reason why I try to use the ids vectors is that I
> want to avoid recomputation.
>
> Thanks for your help!
> Werner
HTH,
Marc Schwartz