如何使用for循环从矩阵中提取特定单元格?

时间:2014-01-06 22:24:42

标签: r for-loop matrix dataframe

搜索了一些不同的主题,但我找不到完全相同的问题。我有一个方形相关矩阵,其中行/列名称是基因。切片的矩阵如下所示。

                Xelaev15073085m Xelaev15073088m Xelaev15073090m Xelaev15073095m
Xelaev15000002m       0.1250128      -0.6368677       0.3119062       0.3980826
Xelaev15000006m       0.4127414      -0.8805597       0.6435158       0.9629489
Xelaev15000007m       0.4012530      -0.8854113       0.6425895       0.9614517

我有一个数据框,其中包含我想从这个大矩阵中提取的基因对。

      V1              V2
1 Xelaev15011657m Xelaev15017932m
2 Xelaev15011587m Xelaev15046612m
3 Xelaev15011594m Xelaev15046616m
4 Xelaev15011597m Xelaev15046617m
5 Xelaev15011603m Xelaev15046624m
6 Xelaev15011654m Xelaev15017928m

我正在尝试遍历数据框并输出对matrix["gene1","gene2"]的矩阵单元格(例如,比较Xelaev15073085mXelaev15000002m时的值为0.1250128)。在单个基因的基础上这样做很容易,但是我在for循环中为这个列表中的数千对做这个尝试是失败的。在下面的示例中,headinglist是上面数据框的样本,而FullcorSM是完整的相关矩阵。

for(i in headedlist$V1){
   data.frame(i, headedlist[i,2], FullcorSM[i,headedlist[i,2]])
}

以上行是我的第一次尝试并返回null。我的第二次尝试如下所示。

for(i in 1:nrow(stagelist)){
  write.table(data.frame(stagelist$V1, stagelist$V2, FullcorSM["stagelist$V1","stagelist$V2"]),
              file="sampleout",
              sep="\t",quote=F)
}

返回一个越界错误。要在FullcorSM["stagelist$V1", "stagelist$V2"]部分中没有引号的情况下执行第二个示例,将返回第一列中每个第二列的所有值,更接近我想要的但仍然缺少一些关于R如何解释我的矩阵/数据的知识框架语法,但我不清楚修复是什么。有关如何进行的任何见解?

2 个答案:

答案 0 :(得分:5)

您尝试创建的功能实际上已构建到R中。您可以使用另一个双列矩阵从矩阵中提取值,其中第一列表示rownames,第二列表示列名称。例如:

m = as.matrix(read.table(text="                Xelaev15073085m Xelaev15073088m Xelaev15073090m Xelaev15073095m
Xelaev15000002m       0.1250128      -0.6368677       0.3119062       0.3980826
Xelaev15000006m       0.4127414      -0.8805597       0.6435158       0.9629489
Xelaev15000007m       0.4012530      -0.8854113       0.6425895       0.9614517"))

# note that your subscript matrix has to be a matrix too, not a data frame
n = as.matrix(read.table(text="Xelaev15000002m Xelaev15073088m
Xelaev15000006m Xelaev15073090m"))

# then it's quite simple
print(m[n])
# [1] -0.6368677  0.6435158

答案 1 :(得分:1)

远不像@David Robinson那样干净,非常好的解决方案。无论如何,在这里,哪些基因在行中并且在相关矩阵中的列中并且如果下标矩阵包含不在相关矩阵中的组合并不重要。与@ David的解决方案中相同的矩阵名称:

# combinations of row and column names for original and transposed correlation matrix
m_comb <- c(outer(rownames(m), colnames(m), paste),
            outer(rownames(t(m)), colnames(t(m)), paste))

# 'dim names' in subscript matrix
n_comb <- paste(n[, "V1"], n[, "V2"])

# subset
m[n[n_comb %in% m_comb, ]]
# [1] -0.6368677  0.6435158

<强>更新

另一种可能性,稍微复杂但可能是更有用的输出。首先将相关矩阵读取到数据帧df,将下标矩阵读取到数据帧df2

# add row names as a column in correlation matrix
df$rows <- rownames(df)

# melt the correlation matrix
library(reshape2)
df3 <- melt(df)

# merge subscript data and correlation data
df4 <- merge(x = df2, y = df3, by.x = c("V1", "V2"), by.y = c("rows", "variable"))
df4
#                V1              V2      value
# 1 Xelaev15000002m Xelaev15073088m -0.6368677
# 2 Xelaev15000006m Xelaev15073090m  0.6435158