使用R附加3个二维矩阵

时间:2015-03-29 19:14:07

标签: r matrix

我在R中有三个二维矩阵。我想合并它们以获得最终数组。是否可以帮助R?中的示例代码?

具体来说,让我们说我有以下矩阵:

Matrix 1
1;  2;  3;
4;  5;  6;
7;  8;  9; 

Matrix 2
A;  B;   C;
D;  E;   F; 
G;  H;   I;

Matrix 3
P;  Q;  R; 
S;  T;  U;
V;  W;  X;

我希望看到的结果矩阵是:

 Matrix 4
 1;A;P 2;B;Q 3;C;R
 4;D;S 5;E;T 6;F;U
 7;G;V 8;H;W 9;I;X

请注意,矩阵的尺寸不固定,但保证所有矩阵的尺寸相同。

对于Matrix4,我想为每个元素添加一个常量。所以Matrix 5将是

 Matrix 5
 X;1;A;P X;2;B;Q X;3;C;R
 X;4;D;S X;5;E;T X;6;F;U
 X;7;G;V X;8;H;W X;9;I;X

完成后,我想将Matrix转换为列表

 X;1;A;P 
 X;2;B;Q 
 X;3;C;R
 X;4;D;S 
 X;5;E;T 
 X;6;F;U
 X;7;G;V 
 X;8;H;W 
 X;9;I;X

Froma更大的图片,我尝试的是,我有3个文件,其中数据按矩阵中的位置链接。一旦数据链接完成,如Matrix 5所示,当数据附加在一起时,位置确实无关紧要。我试图获得可以处理的最终结果。

2 个答案:

答案 0 :(得分:2)

尝试

do.call(cbind,lapply(seq_len(ncol(m1)),
      function(i) paste(m1[,i], m2[,i], m3[,i], sep=';')))
#     [,1]    [,2]    [,3]   
#[1,] "1;A;P" "2;B;Q" "3;C;R"
#[2,] "4;D;S" "5;E;T" "6;F;U"
#[3,] "7;G;V" "8;H;W" "9;I;X"

或者

`dim<-`(do.call(paste,c(mget(paste0('m',1:3)), sep=';')), dim(m1))
 #      [,1]    [,2]    [,3]   
 #[1,] "1;A;P" "2;B;Q" "3;C;R"
 #[2,] "4;D;S" "5;E;T" "6;F;U"
 #[3,] "7;G;V" "8;H;W" "9;I;X"

或者

 mNew <- m1
 mNew[] <- do.call(sprintf, c(mget(paste0('m', 1:3)), fmt='%s;%s;%s'))
 mNew
 #      [,1]    [,2]    [,3]   
 #[1,] "1;A;P" "2;B;Q" "3;C;R"
 #[2,] "4;D;S" "5;E;T" "6;F;U"
 #[3,] "7;G;V" "8;H;W" "9;I;X"

更新

如果我们需要将一个常量(&#39; X&#39;)附加到&#39; mNew&#39;

的所有元素
mNew[] <-  paste("X", mNew, sep=';')
mNew
#      [,1]      [,2]      [,3]     
#[1,] "X;1;A;P" "X;2;B;Q" "X;3;C;R"
#[2,] "X;4;D;S" "X;5;E;T" "X;6;F;U"
#[3,] "X;7;G;V" "X;8;H;W" "X;9;I;X"

转换为&#39;列表&#39;不清楚。我们可以使用split将元素拆分为&#39; row&#39;或者&#39;列&#39;,即

 split(mNew, col(mNew))
 split(mNew, row(mNew))

转换&#39; mNew&#39;中的各个元素列出元素,

 as.list(mNew)

数据

m1 <- t(matrix(1:9, ncol=3))
m2 <-t( matrix(LETTERS[1:9], ncol=3))
m3 <-t( matrix(LETTERS[16:24], ncol=3))

答案 1 :(得分:1)

添加常量“B”并返回条目列表:

m <- matrix(1:4, 2)
l <- list("B", m, m, m)
as.list(Reduce(function(m1, m2) paste(m1, m2, sep = ";"), l))
[[1]]
[1] "B;1;1;1"

[[2]]
[1] "B;2;2;2"

[[3]]
[1] "B;3;3;3"

[[4]]
[1] "B;4;4;4"

虽然我建议只使用

返回的向量
Reduce(function(m1, m2) paste(m1, m2, sep = ";"), l)