我有22个矩阵,它们具有相同的行数(即691行)和不同的列数(即22-25列)。我必须在每个矩阵中添加对应于同一行、同一列的值,从而生成维度691*25的一个矩阵。
fullanno1 has 691 rows & 25 columns:
>colnames(fullanno1)
[1] "coding-notMod3" "coding-synonymous" "coding-synonymous-near-splice"
[4] "intergenic" "intron" "missense"
[7] "missense-near-splice" "near-gene-3" "near-gene-5"
[10] "splice-3" "splice-5" "stop-gained"
[13] "stop-gained-near-splice" "stop-lost" "utr-3"
[16] "utr-5" "CTCF" "E"
[19] "None" "PF" "R"
[22] "T" "TSS" "WE"
[25] "coding-notMod3-near-splice"
fullanno2 has 691 rows and 22 columns:
>colnames(fullanno2)
[1] "coding-synonymous" "coding-synonymous-near-splice" "intergenic"
[4] "intron" "missense" "missense-near-splice"
[7] "near-gene-3" "near-gene-5" "splice-3"
[10] "splice-5" "stop-gained" "stop-lost"
[13] "utr-3" "utr-5" "CTCF"
[16] "E" "None" "PF"
[19] "R" "T" "TSS"
[22] "WE" 每个矩阵都是一个具有数值的双矩阵。如何将这两个矩阵相加,得到第三个维数为691*25的矩阵。由于fullanno2短于三列,因此对于这些列,生成的矩阵将仅具有来自第一个矩阵的值。
我的方法是:对列名进行设置,得到不存在于较小矩阵中的列,并将它们绑定到以0为值的较小矩阵中。然后将这两个矩阵相加。
> column.names<-setdiff(colnames(fullanno1),colnames(fullanno2))
[1] "coding-notMod3" "stop-gained-near-splice" "coding-notMod3-near-splice"
> column<-0
>cbind(fullanno2,column)
>colnames(fullanno2)[23]<-column.name[1]
>cbind(fullanno2,column)
>colnames(fullanno2)[24]<-column.name[2]
>cbind(fullanno2,column)
>colnames(fullanno2)[25]<-column.name[3]但这对所有矩阵来说都是乏味的。有什么建议吗?
发布于 2013-10-12 18:12:09
所以你想把所有的矩阵加起来,最后得到一个矩阵?使用plyr和reshape2库是一种简单但可能缓慢的方法(我怀疑,但这对您的矩阵可能不是什么大问题)。您可以从矩阵列表开始:
make.matrix <- function() {
cols <- sample(month.name, runif(1, 2, 12))
matrix(rnorm(length(cols)*10), 10, length(cols), dimnames=list(NULL, cols))
}
# Make 10 matrices filled with random numbers, having
# varying numbers of columns named after months
my.matrices <- replicate(10, make.matrix())然后你可以把所有的矩阵都融化成一个大的数据
matrix.df <- ldply(my.matrices, melt, varnames=c("row", "col"))
head(matrix.df)
# row col value
# 1 1 February -0.4239145
# 2 2 February 1.1773608
# 3 3 February -2.9565403
# 4 4 February 0.3955096
# 5 5 February -0.3784917
# 6 6 February -0.6234579然后把它放回矩阵中。
sum.matrix <- acast(matrix.df, row ~ col, sum)发布于 2013-10-12 17:57:32
您可以使用match和colnames。例如:
> m1<-matrix(1,3,5)
> colnames(m1)<-LETTERS[1:5]
> m2<-matrix(1:9,3,3)
> colnames(m2)<-c("D","A","C")
> m1
A B C D E
[1,] 1 1 1 1 1
[2,] 1 1 1 1 1
[3,] 1 1 1 1 1
> m2
D A C
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> m3<-m1
> mcol<-match(colnames(m2),colnames(m1))
> m3[,mcol]<-m3[,mcol]+m2
> m3
A B C D E
[1,] 5 1 8 2 1
[2,] 6 1 9 3 1
[3,] 7 1 10 4 1https://stackoverflow.com/questions/19337266
复制相似问题