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)) all3
X1 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.