首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过colname标识填充矩阵

通过colname标识填充矩阵
EN

Stack Overflow用户
提问于 2019-09-22 05:25:14
回答 3查看 80关注 0票数 4

我有很多样本,每个样本都有一个相应的丰度矩阵。从这些丰度矩阵中,我想创建一个大矩阵,其中包含行中每个样本的丰度信息。

例如,单个丰度矩阵将如下所示:

代码语言:javascript
运行
复制
           A  B  C  D 
sample1    1  3  4  2

其中A、B、C和D表示列名称,而丰度是行值。

我想通过匹配colname值来填充我的更大的矩阵,它将所有可能的字母(A:Z)和所有可能的样本(sample1:sampleN)作为行,并将所有可能的字母(A:Z)作为colname。

对于ex。:

代码语言:javascript
运行
复制
         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“列仅由不同样本中"A”的丰度对应的值填充?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-22 06:00:57

从数据开始,稍微更改一下以突出差异:

代码语言:javascript
运行
复制
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"))

首先,我们需要确保两个矩阵具有相同的列名:

代码语言:javascript
运行
复制
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也需要列名对齐:

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2019-09-22 06:26:02

您应该能够利用矩阵索引,如下所示:

代码语言:javascript
运行
复制
big[cbind(rownames(abun),colnames(abun))] <- abun

使用此示例abun舞蹈矩阵,并使用big矩阵填充:

代码语言:javascript
运行
复制
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))
票数 2
EN

Stack Overflow用户

发布于 2019-09-22 07:57:04

另一个使用purrr包中的reducedplyr包中的union_all的解决方案:

代码语言:javascript
运行
复制
library(purrr)
library(dplyr)

sample_names <- c("sample1","sample2","sample3")

生成3个随机数量的数据帧:

代码语言:javascript
运行
复制
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))

这实际上是实现所有魔术的代码:

代码语言:javascript
运行
复制
A <- reduce(list(df1,df2,df3),union_all)
col_order <- sort(colnames(A),decreasing = FALSE)
A <- A[,col_order]
rownames(A) <- sample_names

输出:

代码语言:javascript
运行
复制
> 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58044238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档