【问题标题】:Searching pairs in matrix in R在R中的矩阵中搜索对
【发布时间】:2017-04-15 17:55:19
【问题描述】:

我对 R 比较陌生,所以如果有人可以帮助我,我将不胜感激 :)

我有一个大矩阵,例如: matrix 和基因载体。 我的任务是逐行搜索矩阵并编译具有突变的基因对(矩阵上为 D707H)以及向量中包含的其余基因,并将其添加到新矩阵中。我尝试使用循环来执行此操作,但我不知道如何正确编写它。对于这个矩阵,它应该看起来像这样:

    PR.02.1431    
    NBN BRCA1
    NBN BRCA2
    NBN CHEK2
    NBN ELAC2
    NBN MSR1
    NBN PARP1
    NBN RNASEL

现在我有这样的东西: my idea

“a”是我的初始矩阵。

谁能指出我正确的方向? :)

【问题讨论】:

  • 请做一个可重现的例子。请参阅:stackoverflow.com/questions/5963269/… 图片不是解释您需要什么的最佳方式。还包括所需的结果。
  • 使用dplyr包的gather()函数,多过滤一些。
  • 我相信你的意思是tidyr 包。
  • 请不要将代码或数据作为图像发布。使用dput(x)、复制、粘贴和缩进(stackoverflow 问题编辑器中的ctrl-k)相当简单。我不打算将图像中的数据或代码转录到控制台中进行测试。

标签: r


【解决方案1】:

也许你想要/需要的是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

在您的情况下,您似乎想要任何不是NANaN 的东西。你可以试试:

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

【讨论】:

  • 我试过这个方法但是没有效果...我有一个错误:default method not implemented for type 'list'你知道怎么处理它吗?
  • 显然你的矩阵不是矩阵。如果没有看到比屏幕截图更多的数据,我就忍不住了。
  • 使用which函数后出现。
【解决方案2】:

我知道我的错误在哪里,现在我有了矩阵。分析您的代码效果很好,但这并不是我想要做的。 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 中做到这一点吗?

【讨论】:

  • 这真的不是答案,它似乎是对您问题的澄清(或补充)。如果是这样,请将其放在那里(并删除此答案)。如果我读错了,并且通过此代码解决了问题,那么您可以自己“接受”它作为自我回答。
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 2016-08-26
  • 2018-03-20
  • 2022-06-19
  • 2015-12-09
  • 2010-12-22
  • 2020-02-27
  • 1970-01-01
相关资源
最近更新 更多