Hi,
Is there a way to convert a matrix into a vector representing all
permutations of values and column/row headings with native R functions?
I did this with 2 nested for loops and it took about 25 minutes to run
on a ~700x700 matrix. I'm assuming there must be a smarter way to do
this with R's vector commands, but being new to R, I'm having trouble
making it work.
Thanks,
Ian
[a] [b] [c]
[d] 1 4 7
[e] 2 5 8
[f] 3 6 9
a d 1
a e 2
a f 3
b d 4
b e 5
b f 6
c d 7
c e 8
c f 9
Ian Coe
Connective Capital Management, LLC
385 Homer Ave.
Palo Alto, CA 94301
(650) 321-4826 ext. 03
CONFIDENTIALITY NOTICE: This e-mail communication (inclu...{{dropped:23}}
Not sure what you mean by "permutations" here. I think what you mean
is
that given a matrix m, you want a matrix whose rows are c(i,j,m[i,j]) for
all i and j. You can use the `melt` function in the `reshape` package for
this. See below.
Hope this helps,
-s
> library(reshape)
> melt(matrix(1:4,2,2))
X1 X2 value
1 1 1 1
2 2 1 2
3 1 2 3
4 2 2 4
big <- matrix(1:700^2,700,700)> head(melt(big))
X1 X2 value
1 1 1 1
2 2 1 2
3 3 1 3
4 4 1 4
5 5 1 5
6 6 1 6> system.time(melt(big))
user system elapsed
0.08 0.00 0.08
On Fri, May 29, 2009 at 2:08 PM, Ian Coe <ICoe@connectcap.com> wrote:
> Hi,
>
> Is there a way to convert a matrix into a vector representing all
> permutations of values and column/row headings with native R functions?
> I did this with 2 nested for loops and it took about 25 minutes to run
> on a ~700x700 matrix. I'm assuming there must be a smarter way to do
> this with R's vector commands, but being new to R, I'm having
trouble
> making it work.
>
>
>
> Thanks,
>
> Ian
>
>
>
> [a] [b] [c]
>
> [d] 1 4 7
>
> [e] 2 5 8
>
> [f] 3 6 9
>
>
>
> a d 1
>
> a e 2
>
> a f 3
>
> b d 4
>
> b e 5
>
> b f 6
>
> c d 7
>
> c e 8
>
> c f 9
>
>
>
>
>
>
>
>
>
> Ian Coe
>
>
>
> Connective Capital Management, LLC
>
> 385 Homer Ave.
>
> Palo Alto, CA 94301
>
> (650) 321-4826 ext. 03
>
>
>
> CONFIDENTIALITY NOTICE: This e-mail communication (inclu...{{dropped:23}}
>
> ______________________________________________
> 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]]
About this;
> m <- matrix( 1:9, nr = 3 )
> dimnames( m ) <- list( c("d", "e", "f"),
c("a", "b", "c") )
> data.frame( row = rep( rownames(m), ncol(m)), col = rep(
colnames(m), each = nrow(m)), data = as.vector(m) )
row col data
1 d a 1
2 e a 2
3 f a 3
4 d b 4
5 e b 5
6 f b 6
7 d c 7
8 e c 8
9 f c 9
or
data.frame( do.call( expand.grid, dimnames(m) ), data = as.vector(m))
Some timings on my machine with a 700x700 matrix:
> m <- matrix( rnorm( 700*700 ), nr = 700 )
> dimnames( m ) <- rep( list( as.character( 1:700) ), 2 )
> system.time( data.frame( row = rep( rownames(m), ncol(m)), col = rep(
colnames(m), each = nrow(m)), data = as.vector(m) ) )
user system elapsed
0.468 0.101 0.594
> system.time( data.frame( do.call( expand.grid, dimnames(m) ), data =
as.vector(m)) )
user system elapsed
0.432 0.106 0.551
Romain
Ian Coe wrote:> Hi,
>
> Is there a way to convert a matrix into a vector representing all
> permutations of values and column/row headings with native R functions?
> I did this with 2 nested for loops and it took about 25 minutes to run
> on a ~700x700 matrix. I'm assuming there must be a smarter way to do
> this with R's vector commands, but being new to R, I'm having
trouble
> making it work.
>
>
>
> Thanks,
>
> Ian
>
>
>
> [a] [b] [c]
>
> [d] 1 4 7
>
> [e] 2 5 8
>
> [f] 3 6 9
>
>
>
> a d 1
>
> a e 2
>
> a f 3
>
> b d 4
>
> b e 5
>
> b f 6
>
> c d 7
>
> c e 8
>
> c f 9
>
>
>
>
>
>
>
>
>
> Ian Coe
>
>
>
> Connective Capital Management, LLC
>
> 385 Homer Ave.
>
> Palo Alto, CA 94301
>
> (650) 321-4826 ext. 03
>
>
>
> CONFIDENTIALITY NOTICE: This e-mail communication (inclu...{{dropped:23}}
>
> ______________________________________________
> 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.
>
>
>
--
Romain Francois
Independent R Consultant
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
Try this:> m <- matrix(1:9, 3, dimnames = list(R = letters[1:3], C = LETTERS[1:3])) > as.data.frame.table(m, responseName = "Value")R C Value 1 a A 1 2 b A 2 3 c A 3 4 a B 4 5 b B 5 6 c B 6 7 a C 7 8 b C 8 9 c C 9 On Fri, May 29, 2009 at 2:08 PM, Ian Coe <ICoe at connectcap.com> wrote:> Hi, > > ? Is there a way to ?convert a matrix into a vector representing all > permutations of values and column/row headings with native R functions? > I did this with 2 nested for loops and it took about 25 minutes to run > on a ?~700x700 matrix. ?I'm assuming there must be a smarter way to do > this with R's vector commands, but being new to R, I'm having trouble > making it work. > > > > Thanks, > > Ian > > > > ? ? [a] [b] [c] > > [d] ? ?1 ? ?4 ? ?7 > > [e] ? ?2 ? ?5 ? ?8 > > [f] ? ?3 ? ?6 ? ?9 > > > > a d 1 > > a e 2 > > a f 3 > > b d 4 > > b e 5 > > b f 6 > > c d 7 > > c e 8 > > c f 9 > > > > > > > > > > Ian Coe > > > > Connective Capital Management, LLC > > 385 Homer Ave. > > Palo Alto, CA 94301 > > (650) 321-4826 ext. 03 > > > > CONFIDENTIALITY NOTICE: This e-mail communication (inclu...{{dropped:23}} > > ______________________________________________ > 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. >
On Fri, 2009-05-29 at 11:08 -0700, Ian Coe wrote:> Hi, > > Is there a way to convert a matrix into a vector representing all > permutations of values and column/row headings with native R functions? > I did this with 2 nested for loops and it took about 25 minutes to run > on a ~700x700 matrix. I'm assuming there must be a smarter way to do > this with R's vector commands, but being new to R, I'm having trouble > making it work.Here is one way:> mat <- matrix(1:9, ncol = 3) > colnames(mat) <- c("a","b","c") > rownames(mat) <- c("d","e","f") > > rc <- expand.grid(rownames(mat), colnames(mat)) > res <- data.frame(Row = rc$Var2, Col = rc$Var1,+ Perm = as.vector(mat))> resRow Col Perm 1 a d 1 2 a e 2 3 a f 3 4 b d 4 5 b e 5 6 b f 6 7 c d 7 8 c e 8 9 c f 9 And timings for something similar to your 700*700 problem:> mat <- matrix(seq_len(700*700), ncol = 700) > colnames(mat) <- as.character(1:700) > rownames(mat) <- as.character(1:700) > > system.time({+ rc <- expand.grid(rownames(mat), colnames(mat)) + res <- data.frame(Row = rc$Var2, Col = rc$Var1, + Perm = as.vector(mat)) + }) user system elapsed 0.631 0.028 0.690> head(res)Row Col Perm 1 1 1 1 2 1 2 2 3 1 3 3 4 1 4 4 5 1 5 5 6 1 6 6 HTH G> > > > Thanks, > > Ian > > > > [a] [b] [c] > > [d] 1 4 7 > > [e] 2 5 8 > > [f] 3 6 9 > > > > a d 1 > > a e 2 > > a f 3 > > b d 4 > > b e 5 > > b f 6 > > c d 7 > > c e 8 > > c f 9 > > > > > > > > > > Ian Coe > > > > Connective Capital Management, LLC > > 385 Homer Ave. > > Palo Alto, CA 94301 > > (650) 321-4826 ext. 03 > > > > CONFIDENTIALITY NOTICE: This e-mail communication (inclu...{{dropped:23}} > > ______________________________________________ > 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.-- %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~% Dr. Gavin Simpson [t] +44 (0)20 7679 0522 ECRC, UCL Geography, [f] +44 (0)20 7679 0565 Pearson Building, [e] gavin.simpsonATNOSPAMucl.ac.uk Gower Street, London [w] http://www.ucl.ac.uk/~ucfagls/ UK. WC1E 6BT. [w] http://www.freshwaters.org.uk %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~% -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 197 bytes Desc: This is a digitally signed message part URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20090529/6b37c756/attachment-0002.bin>
Ian Coe wrote:> Hi, > > Is there a way to convert a matrix into a vector representing all > permutations of values and column/row headings with native R functions? > I did this with 2 nested for loops and it took about 25 minutes to run > on a ~700x700 matrix. I'm assuming there must be a smarter way to do > this with R's vector commands, but being new to R, I'm having trouble > making it work. > > > > Thanks, > > Ian > > > > [a] [b] [c] > > [d] 1 4 7 > > [e] 2 5 8 > > [f] 3 6 9 > > > > a d 1 > > a e 2 > > a f 3 > > b d 4 > > b e 5 > > b f 6 > > c d 7 > > c e 8 > > c f 9 > > > > > > > > > > Ian Coe > > > > Connective Capital Management, LLC > > 385 Homer Ave. > > Palo Alto, CA 94301 > > (650) 321-4826 ext. 03 > > > > CONFIDENTIALITY NOTICE: This e-mail communication (inclu...{{dropped:23}} > > ______________________________________________ > 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. >Hi Ian, Here's one way you could do it (assuming ori.mat is the original matrix and ori.mat has labeled columns and rows):> a.matrix <- expand.grid(rownames(ori.mat),colnames(ori.mat)) > final.answer <- cbind(a.matrix,ori.mat[seq_along(ori.mat)])Cheers, -- *Luc Villandr?* /Biostatistician McGill University Health Center - Montreal Children's Hospital Research Institute/