Jason Shaw
2009-Feb-12 19:31 UTC
[R] Extending each element in a list, or rbind()-ing arrays of different length without recycling
Hi, I'm trying to take a matrix such as [,1] [,2] [,3] [,4] [,5] [1,] 2 7 2 7 9 [2,] 10 10 6 8 6 [3,] 1 9 7 2 0 and generate a new matrix which contains only the unique values in each row: [,1] [,2] [,3] [,4] [,5] [1,] 2 7 9 NA NA [2,] 10 6 8 NA NA [3,] 1 9 7 2 0 My problem is that I can use apply(matrix,MARGIN=1,FUN=unique) to find the unique values, but this leaves me with a list with arrays of different length:> x <- apply(peaks,MARGIN=1,FUN=unique)[[1]] [1] 2 7 9 [[2]] [1] 10 6 8 [[3]] [1] 1 9 7 2 0 and using do.call("rbind",x) recycles the values of the shorter vectors instead of filling them with NA:> do.call("rbind",x)[,1] [,2] [,3] [,4] [,5] [1,] 2 7 9 2 7 [2,] 10 6 8 10 6 [3,] 1 9 7 2 0 So, I'd like to either take every element of the list and extend it with NAs to the length of the longest element, or rbind every element where missing places are filled with NAs instead of recycled values. Is this possible? Of course, the solution is trivial using a loop, but I'm trying to avoid this. Thanks for any suggestions.
Jorge Ivan Velez
2009-Feb-12 19:40 UTC
[R] Extending each element in a list, or rbind()-ing arrays of different length without recycling
Dear Jason, Try this: x<-matrix(scan(),byrow=TRUE,ncol=5) 2 7 2 7 9 10 10 6 8 6 1 9 7 2 0 res<-apply(x,1,unique) # Unique values maxlength<-max(do.call(c,lapply(res,length))) # Maximum length of unique values # Your matrix do.call(rbind,lapply(res,function(x){ x[maxlength]<-NA x } ) ) HTH, Jorge On Thu, Feb 12, 2009 at 2:31 PM, Jason Shaw <jason.shaw.23@gmail.com> wrote:> Hi, > > I'm trying to take a matrix such as > > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 2 7 9 > [2,] 10 10 6 8 6 > [3,] 1 9 7 2 0 > > and generate a new matrix which contains only the unique values in each > row: > > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 9 NA NA > [2,] 10 6 8 NA NA > [3,] 1 9 7 2 0 > > My problem is that I can use apply(matrix,MARGIN=1,FUN=unique) to find > the unique values, but this leaves me with a list with arrays of > different length: > > > x <- apply(peaks,MARGIN=1,FUN=unique) > [[1]] > [1] 2 7 9 > > [[2]] > [1] 10 6 8 > > [[3]] > [1] 1 9 7 2 0 > > and using do.call("rbind",x) recycles the values of the shorter > vectors instead of filling them with NA: > > > do.call("rbind",x) > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 9 2 7 > [2,] 10 6 8 10 6 > [3,] 1 9 7 2 0 > > So, I'd like to either take every element of the list and extend it > with NAs to the length of the longest element, or rbind every element > where missing places are filled with NAs instead of recycled values. > Is this possible? Of course, the solution is trivial using a loop, > but I'm trying to avoid this. > > Thanks for any suggestions. > > ______________________________________________ > R-help@r-project.org mailing list > 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]]
markleeds at verizon.net
2009-Feb-12 20:06 UTC
[R] Extending each element in a list, or rbind()-ing arrays of different length without recycling
Hi Jason: below seems to work. you have to take the transpose because the apply returns the rows transposed. i'm also not sure how to make the NAs be the last ones but maybe someone can show us how to do that. mat <- matrix(c(2,7,2,7,9,10,10,6,8,6,1,9,7,2,0),byrow=TRUE,nrow=3) print(mat) t(apply(mat,1, function(.row) { .row[duplicated(.row)] <- NA .row })) On Thu, Feb 12, 2009 at 2:31 PM, Jason Shaw wrote:> Hi, > > I'm trying to take a matrix such as > > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 2 7 9 > [2,] 10 10 6 8 6 > [3,] 1 9 7 2 0 > > and generate a new matrix which contains only the unique values in > each row: > > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 9 NA NA > [2,] 10 6 8 NA NA > [3,] 1 9 7 2 0 > > My problem is that I can use apply(matrix,MARGIN=1,FUN=unique) to find > the unique values, but this leaves me with a list with arrays of > different length: > >> x <- apply(peaks,MARGIN=1,FUN=unique) > [[1]] > [1] 2 7 9 > > [[2]] > [1] 10 6 8 > > [[3]] > [1] 1 9 7 2 0 > > and using do.call("rbind",x) recycles the values of the shorter > vectors instead of filling them with NA: > >> do.call("rbind",x) > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 9 2 7 > [2,] 10 6 8 10 6 > [3,] 1 9 7 2 0 > > So, I'd like to either take every element of the list and extend it > with NAs to the length of the longest element, or rbind every element > where missing places are filled with NAs instead of recycled values. > Is this possible? Of course, the solution is trivial using a loop, > but I'm trying to avoid this. > > Thanks for any suggestions. > > ______________________________________________ > R-help at r-project.org mailing list > 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.
Gabor Grothendieck
2009-Feb-12 20:16 UTC
[R] Extending each element in a list, or rbind()-ing arrays of different length without recycling
Try this. After the apply from your post we use lapply to make each series into a zoo series so that we can later use zoo's multiway merge. Finally we actually merge them and in the next statement just makes nice column names:> library(zoo)> all3 <- do.call(merge, lapply(apply(peaks, 1, unique), zoo)) > colnames(all3) <- make.names(1:ncol(all3)) > all3X1 X2 X3 1 2 10 1 2 7 6 9 3 9 8 7 4 NA NA 2 5 NA NA 0 On Thu, Feb 12, 2009 at 2:31 PM, Jason Shaw <jason.shaw.23 at gmail.com> wrote:> Hi, > > I'm trying to take a matrix such as > > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 2 7 9 > [2,] 10 10 6 8 6 > [3,] 1 9 7 2 0 > > and generate a new matrix which contains only the unique values in each row: > > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 9 NA NA > [2,] 10 6 8 NA NA > [3,] 1 9 7 2 0 > > My problem is that I can use apply(matrix,MARGIN=1,FUN=unique) to find > the unique values, but this leaves me with a list with arrays of > different length: > >> x <- apply(peaks,MARGIN=1,FUN=unique) > [[1]] > [1] 2 7 9 > > [[2]] > [1] 10 6 8 > > [[3]] > [1] 1 9 7 2 0 > > and using do.call("rbind",x) recycles the values of the shorter > vectors instead of filling them with NA: > >> do.call("rbind",x) > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 9 2 7 > [2,] 10 6 8 10 6 > [3,] 1 9 7 2 0 > > So, I'd like to either take every element of the list and extend it > with NAs to the length of the longest element, or rbind every element > where missing places are filled with NAs instead of recycled values. > Is this possible? Of course, the solution is trivial using a loop, > but I'm trying to avoid this. > > Thanks for any suggestions. > > ______________________________________________ > R-help at r-project.org mailing list > 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. >
markleeds at verizon.net
2009-Feb-12 21:05 UTC
[R] Extending each element in a list, or rbind()-ing arrays of different length without recycling
Thanks Rolf. very nice but "pretty easy" is ALWAYS a relative statement. On Thu, Feb 12, 2009 at 3:59 PM, Rolf Turner wrote:> On 13/02/2009, at 9:06 AM, markleeds at verizon.net wrote: > >> Hi Jason: below seems to work. you have to take the transpose because >> the apply >> returns the rows transposed. i'm also not sure how to make the NAs be >> the last >> ones but maybe someone can show us how to do that. > > Pretty easy: > > na.at.end <- function(x){ > i <- is.na(x) > c(x[!i],rep(NA,sum(i))) > } > >> >> mat <- matrix(c(2,7,2,7,9,10,10,6,8,6,1,9,7,2,0),byrow=TRUE,nrow=3) >> print(mat) >> >> t(apply(mat,1, function(.row) { >> .row[duplicated(.row)] <- NA >> .row >> })) > > Then just change to: > > t(apply(mat,1, function(.row) { > .row[duplicated(.row)] <- NA > na.at.end(.row) > })) > > cheers, > > Rolf > > ###################################################################### > Attention: This e-mail message is privileged and confidential. If you > are not the intended recipient please delete the message and notify > the sender. Any views or opinions presented are solely those of the > author. > > This e-mail has been scanned and cleared by MailMarshal > www.marshalsoftware.com > ######################################################################
Patrick Burns
2009-Feb-13 08:59 UTC
[R] Extending each element in a list, or rbind()-ing arrays of different length without recycling
My question is: Why would you want a data structure that is clearly not expressive of the data involved? Let me guess. You are coming from statistical software where data are always rectangular. Patrick Burns patrick at burns-stat.com +44 (0)20 8525 0696 http://www.burns-stat.com (home of "The R Inferno" and "A Guide for the Unwilling S User") Jason Shaw wrote:> Hi, > > I'm trying to take a matrix such as > > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 2 7 9 > [2,] 10 10 6 8 6 > [3,] 1 9 7 2 0 > > and generate a new matrix which contains only the unique values in each row: > > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 9 NA NA > [2,] 10 6 8 NA NA > [3,] 1 9 7 2 0 > > My problem is that I can use apply(matrix,MARGIN=1,FUN=unique) to find > the unique values, but this leaves me with a list with arrays of > different length: > > >> x <- apply(peaks,MARGIN=1,FUN=unique) >> > [[1]] > [1] 2 7 9 > > [[2]] > [1] 10 6 8 > > [[3]] > [1] 1 9 7 2 0 > > and using do.call("rbind",x) recycles the values of the shorter > vectors instead of filling them with NA: > > >> do.call("rbind",x) >> > [,1] [,2] [,3] [,4] [,5] > [1,] 2 7 9 2 7 > [2,] 10 6 8 10 6 > [3,] 1 9 7 2 0 > > So, I'd like to either take every element of the list and extend it > with NAs to the length of the longest element, or rbind every element > where missing places are filled with NAs instead of recycled values. > Is this possible? Of course, the solution is trivial using a loop, > but I'm trying to avoid this. > > Thanks for any suggestions. > > ______________________________________________ > R-help at r-project.org mailing list > 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. > > >