Bert Gunter
2022-Apr-25 14:30 UTC
[R] Confusing fori or ifelse result in matrix manipulation
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 at 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 at r-project.org> On Behalf Of Uwe Freier > > Sent: Sunday, April 24, 2022 11:06 AM > > To: r-help at 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 at 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> > 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> > and provide commented, minimal, self-contained, reproducible code. > > > > ______________________________________________ > > R-help at 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. > > ______________________________________________ > R-help at 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.
Eric Berger
2022-Apr-25 14:33 UTC
[R] Confusing fori or ifelse result in matrix manipulation
M[,x==1] is not the same as M[,x] :-) However, M[,!!x] is the same as M[,x==1] and saves one character! The point of this is "I can name that tune in ... " (as if that was not obvious) On Mon, Apr 25, 2022 at 5:30 PM Bert Gunter <bgunter.4567 at gmail.com> 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 at 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 at r-project.org> On Behalf Of Uwe Freier > > > Sent: Sunday, April 24, 2022 11:06 AM > > > To: r-help at 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 at 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> > > 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> > > and provide commented, minimal, self-contained, reproducible code. > > > > > > ______________________________________________ > > > R-help at 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. > > > > ______________________________________________ > > R-help at 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. > > ______________________________________________ > R-help at 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. >[[alternative HTML version deleted]]
Ivan Calandra
2022-Apr-25 14:38 UTC
[R] Confusing fori or ifelse result in matrix manipulation
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 at 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 at r-project.org> On Behalf Of Uwe Freier >>> Sent: Sunday, April 24, 2022 11:06 AM >>> To: r-help at 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 at 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>>> 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>>> and provide commented, minimal, self-contained, reproducible code. >>> >>> ______________________________________________ >>> R-help at 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. >> ______________________________________________ >> R-help at 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.