Hi - I have a matrix of n rows and 4 columns. I want to cap the value in each column by a different upper bound. So, suppose my matrix is somematrix <- matrix(c(1,4,3,6,3,9,12,8,5,7,11,11),nrow=3,ncol=4)> somematrix[,1] [,2] [,3] [,4] [1,] 1 6 12 7 [2,] 4 3 8 11 [3,] 3 9 5 11 Now I want to have the maximum value in each column described by UB=c(2.5, 5.5, 8.5, 10.5) So that the right answer will look like: [,1] [,2] [,3] [,4] [1,] 1 5.5 8.5 7 [2,] 2.5 3 8 10.5 [3,] 2.5 5.5 5 10.5 I've tried a few things, like: newmatrix <- apply(somematrix,c(1,2),function(x) min(UB,x)) but I can't figure out to apply the relevant element of the UB list to the right element of the matrix. When I run the above, for example, it takes min(UB,x) over all UB, so I get: newmatrix [,1] [,2] [,3] [,4] [1,] 1.0 2.5 2.5 2.5 [2,] 2.5 2.5 2.5 2.5 [3,] 2.5 2.5 2.5 2.5 I'm sure there's a simple and elegant solution but I don't know what it is! Thanks in advance, Mike Michael Ashton, CFA Managing Principal Enduring Investments LLC W: 973.457.4602 C: 551.655.8006 Schedule a Call: https://calendly.com/m-ashton [[alternative HTML version deleted]]
Use the pmin function, not min, for this purpose. On May 27, 2020 10:46:13 AM PDT, Michael Ashton <m.ashton at enduringinvestments.com> wrote:>Hi - > >I have a matrix of n rows and 4 columns. > >I want to cap the value in each column by a different upper bound. So, >suppose my matrix is > >somematrix <- matrix(c(1,4,3,6,3,9,12,8,5,7,11,11),nrow=3,ncol=4) >> somematrix > [,1] [,2] [,3] [,4] >[1,] 1 6 12 7 >[2,] 4 3 8 11 >[3,] 3 9 5 11 > >Now I want to have the maximum value in each column described by >UB=c(2.5, 5.5, 8.5, 10.5) > >So that the right answer will look like: > [,1] [,2] [,3] [,4] >[1,] 1 5.5 8.5 7 >[2,] 2.5 3 8 10.5 >[3,] 2.5 5.5 5 10.5 > >I've tried a few things, like: >newmatrix <- apply(somematrix,c(1,2),function(x) min(UB,x)) > >but I can't figure out to apply the relevant element of the UB list to >the right element of the matrix. When I run the above, for example, it >takes min(UB,x) over all UB, so I get: > >newmatrix > [,1] [,2] [,3] [,4] >[1,] 1.0 2.5 2.5 2.5 >[2,] 2.5 2.5 2.5 2.5 >[3,] 2.5 2.5 2.5 2.5 > >I'm sure there's a simple and elegant solution but I don't know what it >is! > >Thanks in advance, > >Mike > >Michael Ashton, CFA >Managing Principal > >Enduring Investments LLC >W: 973.457.4602 >C: 551.655.8006 >Schedule a Call: https://calendly.com/m-ashton > > > [[alternative HTML version deleted]] > >______________________________________________ >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.-- Sent from my phone. Please excuse my brevity.
Hello, Try pmin. And loop by column/UB index with sapply/seq_along. sapply(seq_along(UB), function(i) pmin(UB[i], somematrix[,i])) # [,1] [,2] [,3] [,4] #[1,] 1.0 5.5 8.5 7.0 #[2,] 2.5 3.0 8.0 10.5 #[3,] 2.5 5.5 5.0 10.5 Hope this helps, Rui Barradas ?s 18:46 de 27/05/20, Michael Ashton escreveu:> Hi - > > I have a matrix of n rows and 4 columns. > > I want to cap the value in each column by a different upper bound. So, suppose my matrix is > > somematrix <- matrix(c(1,4,3,6,3,9,12,8,5,7,11,11),nrow=3,ncol=4) >> somematrix > [,1] [,2] [,3] [,4] > [1,] 1 6 12 7 > [2,] 4 3 8 11 > [3,] 3 9 5 11 > > Now I want to have the maximum value in each column described by > UB=c(2.5, 5.5, 8.5, 10.5) > > So that the right answer will look like: > [,1] [,2] [,3] [,4] > [1,] 1 5.5 8.5 7 > [2,] 2.5 3 8 10.5 > [3,] 2.5 5.5 5 10.5 > > I've tried a few things, like: > newmatrix <- apply(somematrix,c(1,2),function(x) min(UB,x)) > > but I can't figure out to apply the relevant element of the UB list to the right element of the matrix. When I run the above, for example, it takes min(UB,x) over all UB, so I get: > > newmatrix > [,1] [,2] [,3] [,4] > [1,] 1.0 2.5 2.5 2.5 > [2,] 2.5 2.5 2.5 2.5 > [3,] 2.5 2.5 2.5 2.5 > > I'm sure there's a simple and elegant solution but I don't know what it is! > > Thanks in advance, > > Mike > > Michael Ashton, CFA > Managing Principal > > Enduring Investments LLC > W: 973.457.4602 > C: 551.655.8006 > Schedule a Call: https://calendly.com/m-ashton > > > [[alternative HTML version deleted]] > > ______________________________________________ > 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. >
That's it! Thanks. Learn something new every day! Michael Ashton, CFA Managing Principal Enduring Investments LLC W: 973.457.4602 C: 551.655.8006 Schedule a Call: https://calendly.com/m-ashton -----Original Message----- From: Rui Barradas [mailto:ruipbarradas at sapo.pt] Sent: Wednesday, May 27, 2020 1:51 PM To: Michael Ashton; r-help at r-project.org Subject: Re: [R] struggling with apply Hello, Try pmin. And loop by column/UB index with sapply/seq_along. sapply(seq_along(UB), function(i) pmin(UB[i], somematrix[,i])) # [,1] [,2] [,3] [,4] #[1,] 1.0 5.5 8.5 7.0 #[2,] 2.5 3.0 8.0 10.5 #[3,] 2.5 5.5 5.0 10.5 Hope this helps, Rui Barradas ?s 18:46 de 27/05/20, Michael Ashton escreveu:> Hi - > > I have a matrix of n rows and 4 columns. > > I want to cap the value in each column by a different upper bound. So, suppose my matrix is > > somematrix <- matrix(c(1,4,3,6,3,9,12,8,5,7,11,11),nrow=3,ncol=4) >> somematrix > [,1] [,2] [,3] [,4] > [1,] 1 6 12 7 > [2,] 4 3 8 11 > [3,] 3 9 5 11 > > Now I want to have the maximum value in each column described by > UB=c(2.5, 5.5, 8.5, 10.5) > > So that the right answer will look like: > [,1] [,2] [,3] [,4] > [1,] 1 5.5 8.5 7 > [2,] 2.5 3 8 10.5 > [3,] 2.5 5.5 5 10.5 > > I've tried a few things, like: > newmatrix <- apply(somematrix,c(1,2),function(x) min(UB,x)) > > but I can't figure out to apply the relevant element of the UB list to the right element of the matrix. When I run the above, for example, it takes min(UB,x) over all UB, so I get: > > newmatrix > [,1] [,2] [,3] [,4] > [1,] 1.0 2.5 2.5 2.5 > [2,] 2.5 2.5 2.5 2.5 > [3,] 2.5 2.5 2.5 2.5 > > I'm sure there's a simple and elegant solution but I don't know what it is! > > Thanks in advance, > > Mike > > Michael Ashton, CFA > Managing Principal > > Enduring Investments LLC > W: 973.457.4602 > C: 551.655.8006 > Schedule a Call: https://calendly.com/m-ashton > > > [[alternative HTML version deleted]] > > ______________________________________________ > 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. >
sapply(1:4, FUN=function(i, x, UB=c(2.5, 5.5, 8.5, 10.5)) {result <- x[,i]; result[result > UB[i]] <- UB[i]; result}, x=somematrix) On Wed, May 27, 2020 at 1:46 PM Michael Ashton <m.ashton at enduringinvestments.com> wrote:> > Hi - > > I have a matrix of n rows and 4 columns. > > I want to cap the value in each column by a different upper bound. So, suppose my matrix is > > somematrix <- matrix(c(1,4,3,6,3,9,12,8,5,7,11,11),nrow=3,ncol=4) > > somematrix > [,1] [,2] [,3] [,4] > [1,] 1 6 12 7 > [2,] 4 3 8 11 > [3,] 3 9 5 11 > > Now I want to have the maximum value in each column described by > UB=c(2.5, 5.5, 8.5, 10.5) > > So that the right answer will look like: > [,1] [,2] [,3] [,4] > [1,] 1 5.5 8.5 7 > [2,] 2.5 3 8 10.5 > [3,] 2.5 5.5 5 10.5 > > I've tried a few things, like: > newmatrix <- apply(somematrix,c(1,2),function(x) min(UB,x)) > > but I can't figure out to apply the relevant element of the UB list to the right element of the matrix. When I run the above, for example, it takes min(UB,x) over all UB, so I get: > > newmatrix > [,1] [,2] [,3] [,4] > [1,] 1.0 2.5 2.5 2.5 > [2,] 2.5 2.5 2.5 2.5 > [3,] 2.5 2.5 2.5 2.5 > > I'm sure there's a simple and elegant solution but I don't know what it is! > > Thanks in advance, > > Mike > > Michael Ashton, CFA > Managing Principal > > Enduring Investments LLC > W: 973.457.4602 > C: 551.655.8006 > Schedule a Call: https://calendly.com/m-ashton > > > [[alternative HTML version deleted]] > > ______________________________________________ > 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.
Better, I think (no indexing): t(apply(somematrix,1,function(x)pmin(x,UB))) Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Wed, May 27, 2020 at 10:56 AM Rui Barradas <ruipbarradas at sapo.pt> wrote:> Hello, > > Try pmin. And loop by column/UB index with sapply/seq_along. > > > sapply(seq_along(UB), function(i) pmin(UB[i], somematrix[,i])) > # [,1] [,2] [,3] [,4] > #[1,] 1.0 5.5 8.5 7.0 > #[2,] 2.5 3.0 8.0 10.5 > #[3,] 2.5 5.5 5.0 10.5 > > > Hope this helps, > > Rui Barradas > > > ?s 18:46 de 27/05/20, Michael Ashton escreveu: > > Hi - > > > > I have a matrix of n rows and 4 columns. > > > > I want to cap the value in each column by a different upper bound. So, > suppose my matrix is > > > > somematrix <- matrix(c(1,4,3,6,3,9,12,8,5,7,11,11),nrow=3,ncol=4) > >> somematrix > > [,1] [,2] [,3] [,4] > > [1,] 1 6 12 7 > > [2,] 4 3 8 11 > > [3,] 3 9 5 11 > > > > Now I want to have the maximum value in each column described by > > UB=c(2.5, 5.5, 8.5, 10.5) > > > > So that the right answer will look like: > > [,1] [,2] [,3] [,4] > > [1,] 1 5.5 8.5 7 > > [2,] 2.5 3 8 10.5 > > [3,] 2.5 5.5 5 10.5 > > > > I've tried a few things, like: > > newmatrix <- apply(somematrix,c(1,2),function(x) min(UB,x)) > > > > but I can't figure out to apply the relevant element of the UB list to > the right element of the matrix. When I run the above, for example, it > takes min(UB,x) over all UB, so I get: > > > > newmatrix > > [,1] [,2] [,3] [,4] > > [1,] 1.0 2.5 2.5 2.5 > > [2,] 2.5 2.5 2.5 2.5 > > [3,] 2.5 2.5 2.5 2.5 > > > > I'm sure there's a simple and elegant solution but I don't know what it > is! > > > > Thanks in advance, > > > > Mike > > > > Michael Ashton, CFA > > Managing Principal > > > > Enduring Investments LLC > > W: 973.457.4602 > > C: 551.655.8006 > > Schedule a Call: https://calendly.com/m-ashton > > > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > 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]]