[R] Confusing fori or ifelse result in matrix manipulation
Rui Barradas
ru|pb@rr@d@@ @end|ng |rom @@po@pt
Mon Apr 25 17:25:13 CEST 2022
Hello,
If !!x obfuscates what the is doing, there's
M[, as.logical(x)] <- 0
Hope this helps,
Rui Barradas
Às 15:52 de 25/04/2022, Ivan Calandra escreveu:
> Indeed, of course, my bad! I got confused by Bert's answer...
>
> So my first suggestion to do M[, x == 1] was correct :)
>
> --
> Dr. Ivan Calandra
> Imaging lab
> RGZM - MONREPOS Archaeological Research Centre
> Schloss Monrepos
> 56567 Neuwied, Germany
> +49 (0) 2631 9772-243
> https://www.researchgate.net/profile/Ivan_Calandra
>
> On 25/04/2022 16:44, Eric Berger wrote:
>> M[,x] <- 0 *does not do the same* !! even if x only contains 0's and 1's
>>
>> To understand this, note that
>> M[,c(2,3)]
>> gives columns 2 and 3
>> M[,c(0,3)]
>> gives the 3rd column and
>> M[,c(0,1,0)]
>> gives the *first* column!!
>>
>>
>>
>> On Mon, Apr 25, 2022 at 5:41 PM Ivan Calandra <ivan.calandra using rgzm.de>
>> wrote:
>>
>> Indeed, M[, x] <- 0 does the same, but only if x is 0's and 1's only,
>> right? I thought that it might not always be the case so I choose
>> this
>> maybe superflous approach.
>>
>> M[, 2] does the same of course in the example, but I was assuming
>> that
>> the columns to change to zero are not known in advance and are
>> based on
>> data contained in another vector. Where that vector comes from is
>> important too because the whole thing might be unnecessary. Is that
>> maybe what you were hinting at, Bert?
>>
>> Maybe Uwe can tell us more about what/why he wants to do!
>>
>> Ivan
>>
>> --
>> Dr. Ivan Calandra
>> Imaging lab
>> RGZM - MONREPOS Archaeological Research Centre
>> Schloss Monrepos
>> 56567 Neuwied, Germany
>> +49 (0) 2631 9772-243
>> https://www.researchgate.net/profile/Ivan_Calandra
>>
>> On 25/04/2022 16:30, Bert Gunter wrote:
>> > x == 1 is the same as M[, x] so your expression is the same as
>> > M[, c(FALSE, TRUE, FALSE)] <- 0
>> > which is the same as M[, 2] <- 0
>> >
>> > So what is the point of all this, exactly?
>> >
>> > Bert
>> >
>> > On Mon, Apr 25, 2022 at 7:18 AM Ivan Calandra
>> <ivan.calandra using rgzm.de> wrote:
>> >> Hi Uwe,
>> >>
>> >> If I understood the problem completely and building up on Tim's
>> answer,
>> >> this is even easier:
>> >> M <- A <- matrix(1:9, ncol = 3)
>> >> x <- c(0, 1, 0)
>> >> M[, x == 1] <- 0
>> >> M
>> >>
>> >> The original issue was with the way ifelse works. The
>> explanation is in
>> >> the help page: "ifelse returns a value with the same shape as
>> test||".
>> >> So, because x[i] == 0 returns a single value (TRUE or FALSE),
>> ifelse
>> >> will also return a single value (either A[, i][1] or 0) and not
>> a vector
>> >> of length 3 as you wanted. This single value is recycled to
>> fill M[, i],
>> >> hence the result.
>> >>
>> >> HTH,
>> >> Ivan
>> >>
>> >> --
>> >> Dr. Ivan Calandra
>> >> Imaging lab
>> >> RGZM - MONREPOS Archaeological Research Centre
>> >> Schloss Monrepos
>> >> 56567 Neuwied, Germany
>> >> +49 (0) 2631 9772-243
>> >> https://www.researchgate.net/profile/Ivan_Calandra
>> >>
>> >> On 25/04/2022 16:01, Ebert,Timothy Aaron wrote:
>> >>> A <- matrix(1:9,ncol=3)
>> >>> x <- c(0,1,0)
>> >>> M <- matrix(ncol=3,nrow=3)
>> >>> M<-A
>> >>> for(i in 1:3) {
>> >>> if(x[i]){
>> >>> M[,i] <-0
>> >>> }
>> >>> }
>> >>> }
>> >>> M
>> >>>
>> >>> The outcome you want is to set all of the middle column values
>> to zero. So I used x as a logical in an if test and when true
>> everything in that column is set to zero.
>> >>>
>> >>> Your approach also works but you must go through each element
>> explicitly.
>> >>> A <- matrix(1:9,ncol=3)
>> >>> x <- c(0,1,0)
>> >>> M <- matrix(ncol=3,nrow=3)
>> >>> for(j in 1:3){
>> >>> for(i in 1:3){
>> >>> ifelse(x[i]==1, M[j,i]<-0, M[j,i]<-A[j,i])
>> >>> }
>> >>> }
>> >>> M
>> >>>
>> >>>
>> >>>
>> >>> Tim
>> >>>
>> >>> -----Original Message-----
>> >>> From: R-help <r-help-bounces using r-project.org> On Behalf Of Uwe
>> Freier
>> >>> Sent: Sunday, April 24, 2022 11:06 AM
>> >>> To: r-help using r-project.org
>> >>> Subject: [R] Confusing fori or ifelse result in matrix
>> manipulation
>> >>>
>> >>> [External Email]
>> >>>
>> >>> Hello,
>> >>>
>> >>> sorry for the newbie question but I can't find out where I'm
>> wrong.
>> >>>
>> >>> A <- matrix(1:9,ncol=3)
>> >>> x <- c(0,1,0)
>> >>> M <- matrix(ncol=3,nrow=3)
>> >>> for(i in 1:3) {
>> >>> M[,i] <- ifelse(x[i] == 0, A[,i], 0)
>> >>> }
>> >>>
>> >>> expected:
>> >>>
>> >>>> M
>> >>> [,1] [,2] [,3]
>> >>> [1,] 1 0 7
>> >>> [2,] 2 0 8
>> >>> [3,] 3 0 9
>> >>>
>> >>>
>> >>> but the result is:
>> >>>
>> >>>> M
>> >>> [,1] [,2] [,3]
>> >>> [1,] 1 0 7
>> >>> [2,] 1 0 7
>> >>> [3,] 1 0 7
>> >>>
>> >>>
>> >>> If I do it "manually":
>> >>>
>> >>>> M[,1] <- A[,1]
>> >>>> M[,2] <- 0
>> >>>> M[,3] <- A[,3]
>> >>> M is as expected, where is my misconception?
>> >>>
>> >>> Thanks for any hint and best regards,
>> >>>
>> >>> Uwe
>> >>>
>> >>> ______________________________________________
>> >>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more,
>> see
>>
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_r-2Dhelp&d=DwICAg&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeAsRzsn7AkP-g&m=eyJm06tVDfKvtMDgz6oIWM-WVdoW3Szzb5G6rq0cCO_cB6ljj2x80E4oRkt3Vgba&s=K2RWPvtxaxwigGGH2oOrg8qiDWC5KTu60b8Wjybwsg4&e=
>>
>>
>> <https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_r-2Dhelp&d=DwICAg&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeAsRzsn7AkP-g&m=eyJm06tVDfKvtMDgz6oIWM-WVdoW3Szzb5G6rq0cCO_cB6ljj2x80E4oRkt3Vgba&s=K2RWPvtxaxwigGGH2oOrg8qiDWC5KTu60b8Wjybwsg4&e=>
>>
>> >>> PLEASE do read the posting guide
>>
>> https://urldefense.proofpoint.com/v2/url?u=http-3A__www.R-2Dproject.org_posting-2Dguide.html&d=DwICAg&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeAsRzsn7AkP-g&m=eyJm06tVDfKvtMDgz6oIWM-WVdoW3Szzb5G6rq0cCO_cB6ljj2x80E4oRkt3Vgba&s=L9VXAAYzIzrG2h17hBO-Qfg_EoS2mRQbjs3sRESp62Q&e=
>>
>>
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__www.R-2Dproject.org_posting-2Dguide.html&d=DwICAg&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeAsRzsn7AkP-g&m=eyJm06tVDfKvtMDgz6oIWM-WVdoW3Szzb5G6rq0cCO_cB6ljj2x80E4oRkt3Vgba&s=L9VXAAYzIzrG2h17hBO-Qfg_EoS2mRQbjs3sRESp62Q&e=>
>>
>> >>> and provide commented, minimal, self-contained, reproducible
>> code.
>> >>>
>> >>> ______________________________________________
>> >>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> >>> 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.
>> >> ______________________________________________
>> >> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> >> 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.
>>
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.
>>
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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