通过 colname 身份填充矩阵
Populate matrix by colname identity
我有很多样本,每个样本都有对应的丰度矩阵。从这些丰度矩阵中,我想创建一个大矩阵,其中包含行中每个样本的丰度信息。
例如,单个丰度矩阵如下所示:
A B C D
sample1 1 3 4 2
其中 A、B、C 和 D 代表列名,丰度是行值。
我想通过匹配 colname 值来填充我的较大矩阵,该矩阵将所有可能的字母 (A:Z) 和所有可能的样本 (sample1:sampleN) 列为行。
例如。 :
A B C D E F G .... Z
sample1 1 3 4 2 NA NA NA ....
sample2 NA NA 2 5 7 NA NA ....
sample3 4 NA 6 9 2 NA 2 .....
....
sampleN
不同的样本具有不同的丰度组合,没有保证的顺序。
当迭代添加到这个更大的矩阵时,我如何确保正确的列由正确的丰度值填充(例如,列 "A" 仅由对应于 [=26= 的丰度的值填充] 在不同的样本中)?谢谢!
起始数据,稍作改动以突出差异:
m1 <- as.matrix(read.table(header=TRUE, text="
A B C Z
sample1 1 3 4 2"))
m2 <- as.matrix(read.table(header=TRUE, text="
A B C D E F G
sample2 NA NA 2 5 7 NA NA
sample3 4 NA 6 9 2 NA 2"))
首先,我们需要确保两个矩阵具有相同的列名:
newcols <- setdiff(colnames(m2), colnames(m1))
m1 <- cbind(m1, matrix(NA, nr=nrow(m1), nc=length(newcols), dimnames=list(NULL, newcols)))
newcols <- setdiff(colnames(m1), colnames(m2))
m2 <- cbind(m2, matrix(NA, nr=nrow(m2), nc=length(newcols), dimnames=list(NULL, newcols)))
m1
# A B C Z D E F G
# sample1 1 3 4 2 NA NA NA NA
m2
# A B C D E F G Z
# sample2 NA NA 2 5 7 NA NA NA
# sample3 4 NA 6 9 2 NA 2 NA
现在我们将它们结合起来;常规 cbind
也需要对齐列名:
rbind(m2, m1[,colnames(m2),drop=FALSE])
# A B C D E F G Z
# sample2 NA NA 2 5 7 NA NA NA
# sample3 4 NA 6 9 2 NA 2 NA
# sample1 1 3 4 NA NA NA NA 2
您应该能够利用矩阵索引,如下所示:
big[cbind(rownames(abun),colnames(abun))] <- abun
使用这个例子abun
舞蹈矩阵,和一个big
矩阵来填充:
abun <- matrix(c(1,3,4,2),nrow=1,dimnames=list("sample1",LETTERS[1:4]))
big <- matrix(NA,nrow=5,ncol=26,dimnames=list(paste0("sample",1:5),LETTERS))
使用 purrr
包中的 reduce
和 dplyr
包中的 union_all
的另一种解决方案:
library(purrr)
library(dplyr)
sample_names <- c("sample1","sample2","sample3")
正在生成 3 个随机丰度数据帧:
num1 <- round(runif(runif(1,min = 1, max = 10),min = 1, max = 10))
df1 <- data.frame(t(num1))
colnames(df1) <- sample(LETTERS,length(num1))
num2 <- round(runif(runif(1,min = 1, max = 10),min = 1, max = 10))
df2 <- data.frame(t(num2))
colnames(df2) <- sample(LETTERS,length(num2))
num3 <- round(runif(runif(1,min = 1, max = 10),min = 1, max = 10))
df3 <- data.frame(t(num3))
colnames(df3) <- sample(LETTERS,length(num3))
这实际上是执行所有魔法的代码:
A <- reduce(list(df1,df2,df3),union_all)
col_order <- sort(colnames(A),decreasing = FALSE)
A <- A[,col_order]
rownames(A) <- sample_names
输出:
> A
A C E F O P Q U W Y
sample1 9 NA NA NA 9 NA 5 6 NA NA
sample2 NA NA NA NA 5 4 NA NA 5 NA
sample3 NA 6 5 9 NA NA 3 NA 5 7
我有很多样本,每个样本都有对应的丰度矩阵。从这些丰度矩阵中,我想创建一个大矩阵,其中包含行中每个样本的丰度信息。
例如,单个丰度矩阵如下所示:
A B C D
sample1 1 3 4 2
其中 A、B、C 和 D 代表列名,丰度是行值。
我想通过匹配 colname 值来填充我的较大矩阵,该矩阵将所有可能的字母 (A:Z) 和所有可能的样本 (sample1:sampleN) 列为行。
例如。 :
A B C D E F G .... Z
sample1 1 3 4 2 NA NA NA ....
sample2 NA NA 2 5 7 NA NA ....
sample3 4 NA 6 9 2 NA 2 .....
....
sampleN
不同的样本具有不同的丰度组合,没有保证的顺序。
当迭代添加到这个更大的矩阵时,我如何确保正确的列由正确的丰度值填充(例如,列 "A" 仅由对应于 [=26= 的丰度的值填充] 在不同的样本中)?谢谢!
起始数据,稍作改动以突出差异:
m1 <- as.matrix(read.table(header=TRUE, text="
A B C Z
sample1 1 3 4 2"))
m2 <- as.matrix(read.table(header=TRUE, text="
A B C D E F G
sample2 NA NA 2 5 7 NA NA
sample3 4 NA 6 9 2 NA 2"))
首先,我们需要确保两个矩阵具有相同的列名:
newcols <- setdiff(colnames(m2), colnames(m1))
m1 <- cbind(m1, matrix(NA, nr=nrow(m1), nc=length(newcols), dimnames=list(NULL, newcols)))
newcols <- setdiff(colnames(m1), colnames(m2))
m2 <- cbind(m2, matrix(NA, nr=nrow(m2), nc=length(newcols), dimnames=list(NULL, newcols)))
m1
# A B C Z D E F G
# sample1 1 3 4 2 NA NA NA NA
m2
# A B C D E F G Z
# sample2 NA NA 2 5 7 NA NA NA
# sample3 4 NA 6 9 2 NA 2 NA
现在我们将它们结合起来;常规 cbind
也需要对齐列名:
rbind(m2, m1[,colnames(m2),drop=FALSE])
# A B C D E F G Z
# sample2 NA NA 2 5 7 NA NA NA
# sample3 4 NA 6 9 2 NA 2 NA
# sample1 1 3 4 NA NA NA NA 2
您应该能够利用矩阵索引,如下所示:
big[cbind(rownames(abun),colnames(abun))] <- abun
使用这个例子abun
舞蹈矩阵,和一个big
矩阵来填充:
abun <- matrix(c(1,3,4,2),nrow=1,dimnames=list("sample1",LETTERS[1:4]))
big <- matrix(NA,nrow=5,ncol=26,dimnames=list(paste0("sample",1:5),LETTERS))
使用 purrr
包中的 reduce
和 dplyr
包中的 union_all
的另一种解决方案:
library(purrr)
library(dplyr)
sample_names <- c("sample1","sample2","sample3")
正在生成 3 个随机丰度数据帧:
num1 <- round(runif(runif(1,min = 1, max = 10),min = 1, max = 10))
df1 <- data.frame(t(num1))
colnames(df1) <- sample(LETTERS,length(num1))
num2 <- round(runif(runif(1,min = 1, max = 10),min = 1, max = 10))
df2 <- data.frame(t(num2))
colnames(df2) <- sample(LETTERS,length(num2))
num3 <- round(runif(runif(1,min = 1, max = 10),min = 1, max = 10))
df3 <- data.frame(t(num3))
colnames(df3) <- sample(LETTERS,length(num3))
这实际上是执行所有魔法的代码:
A <- reduce(list(df1,df2,df3),union_all)
col_order <- sort(colnames(A),decreasing = FALSE)
A <- A[,col_order]
rownames(A) <- sample_names
输出:
> A
A C E F O P Q U W Y
sample1 9 NA NA NA 9 NA 5 6 NA NA
sample2 NA NA NA NA 5 4 NA NA 5 NA
sample3 NA 6 5 9 NA NA 3 NA 5 7