r - 按 colname 标识填充矩阵
问题描述
我有很多样本,每个样本都有一个对应的丰度矩阵。从这些丰度矩阵中,我想创建一个大矩阵,其中包含行中每个样本的丰度信息。
例如,单个丰度矩阵如下所示:
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”仅由与不同样本中“A”丰度对应的值填充)?谢谢!
解决方案
起始数据,稍作更改以突出差异:
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
推荐阅读
- terminal - 更改 Tmux 默认快捷方式以在会话之间切换
- google-analytics - Google Analytics 事件值显示在 Google Tag Manager Preview 中,但发布后未在生产中发送
- javascript - css - ckeditor 内容的意外显示
- python - 如何在不替换的情况下从数据框中创建多个欠采样?
- firebase - Firebase 云函数部署错误TS2614
- python - 如何强制 matplotlib 热图单元格为矩形?
- python - 将多个图像转换为 pdf
- gitlab - 如何向 Gitlab 花费时间跟踪项目添加注释
- javascript - 将 style[hash].css 拆分为动态加载的块
- java - phpexcel切换到嵌入式单元格图片?