Заполните матрицу идентификатором имени - PullRequest
4 голосов
/ 22 сентября 2019

У меня есть много образцов, каждый из которых имеет соответствующую матрицу численности.Из этих матриц обилия я хотел бы создать большую матрицу, которая содержит информацию об изобилии для каждой выборки в строках.

Например, одна матрица содержания будет выглядеть следующим образом:

           A  B  C  D 
sample1    1  3  4  2

, где A, B, C и D представляют имена столбцов, а значения - значения строк.

Я хотел бы заполнить мою большую матрицу, в которой в качестве столбцов указаны все возможные буквы (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" в разныхобразцы)?Спасибо!

Ответы [ 3 ]

2 голосов
/ 22 сентября 2019

Вы должны быть в состоянии использовать матричную индексацию, например, так:

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))
2 голосов
/ 22 сентября 2019

Начальные данные, немного изменив их, чтобы выделить различия:

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
1 голос
/ 22 сентября 2019

Другое решение, использующее reduce из purrr пакета и union_all из dplyr пакета:

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
...