我对R很新,所以如果有人能帮助我,我将不胜感激:)
我有一个大型矩阵,例如: matrix 和基因的载体。 我的任务是逐行搜索矩阵并编译具有突变的基因对(在基质上为D707H)与载体中包含的其余基因并将其添加到新的基质中。我尝试用循环做这个,但我不知道如何正确地写它。对于这个矩阵,它看起来应该是这样的:
PR.02.1431
NBN BRCA1
NBN BRCA2
NBN CHEK2
NBN ELAC2
NBN MSR1
NBN PARP1
NBN RNASEL
现在我有这样的事: my idea
“a”是我的初始矩阵。
有人能指出我正确的方向吗? :)
答案 0 :(得分:0)
也许你想要/需要的是which(..., arr.ind = TRUE)
。
一些示例数据,用于演示:
set.seed(2)
n <- 10
mtx <- array(NA, dim = c(n, n))
dimnames(mtx) <- list(letters[1:n], LETTERS[1:n])
mtx[sample(n*n, size = 4)] <- paste0("x", 1:4)
mtx
# A B C D E F G H I J
# a NA NA NA NA NA NA NA NA NA NA
# b NA NA NA NA NA NA NA NA NA NA
# c NA NA NA NA NA NA NA NA NA NA
# d NA NA NA NA NA NA NA NA NA NA
# e NA NA NA NA NA NA NA NA NA NA
# f NA NA NA NA NA NA NA NA NA NA
# g NA "x4" NA NA NA "x3" NA NA NA NA
# h NA NA NA NA NA NA NA NA NA NA
# i NA "x1" NA NA NA NA NA NA NA NA
# j NA NA NA NA NA NA "x2" NA NA NA
在您的情况下,您似乎想要任何不是NA
或NaN
的内容。你可以试试:
which(! is.na(mtx) & ! is.nan(mtx))
# [1] 17 19 57 70
但在检索行/列对时,这并不总是直观的(基因,我认为?)。请尝试改为:
ind <- which(! is.na(mtx) & ! is.nan(mtx), arr.ind = TRUE)
ind
# row col
# g 7 2
# i 9 2
# g 7 6
# j 10 7
如何使用它:整数分别是行索引和列索引。假设您的矩阵使用行名和列名,您可以使用以下命令检索行名:
rownames(mtx)[ ind[,"row"] ]
# [1] "g" "i" "g" "j"
(精明的读者可能会建议我使用rownames(ind)
代替它。它确实有用!)同样适用于colnames
和"col"
。
有趣的是,即使ind
是一个矩阵本身,您也可以通过以下方式轻松地对mtx
进行分组:
mtx[ind]
# [1] "x4" "x1" "x3" "x2"
将所有三个组合在一起,您可以使用:
data.frame(
gene1 = rownames(mtx)[ ind[,"row"] ],
gene2 = colnames(mtx)[ ind[,"col"] ],
val = mtx[ind]
)
# gene1 gene2 val
# 1 g B x4
# 2 i B x1
# 3 g F x3
# 4 j G x2
答案 1 :(得分:0)
我知道我的misteke在哪里,现在我有矩阵。分析你的代码它运作良好,但这不是我想要做的。 a,b,c,d等是生物,行名是基因(A,B,C,D等)。我必须合成一对基因,其中一个基因(在同一列中)具有除NA值以外的其他基因。例如,如果基因 A 在列 a 中的值= 4,我必须:
gene1 gene2
a A B
a A C
a A D
a A E
我试过这种方式,但元素数量不匹配,我不知道如何解决这个问题。
ind= which(! is.na(a) & ! is.nan(a), arr.ind = TRUE)
ind1=which(macierz==1,arr.ind = TRUE)
ramka= data.frame(
kolumna = rownames(a)[ ind[,"row"] ],
gene1 = colnames(a)[ ind[,"col"] ],
gene2 = colnames(a)[ind1[,"col"]],
#val = macierz[ind]
)
你知道如何在R中这样做吗?