[R] Confusing fori or ifelse result in matrix manipulation

Ivan Calandra |v@n@c@|@ndr@ @end|ng |rom rgzm@de
Mon Apr 25 16:52:03 CEST 2022


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.
>



More information about the R-help mailing list