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

ses*_*rda 1 for-loop r 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
Run Code Online (Sandbox Code Playgroud)

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

      V1              V2
1 Xelaev15011657m Xelaev15017932m
2 Xelaev15011587m Xelaev15046612m
3 Xelaev15011594m Xelaev15046616m
4 Xelaev15011597m Xelaev15046617m
5 Xelaev15011603m Xelaev15046624m
6 Xelaev15011654m Xelaev15017928m
Run Code Online (Sandbox Code Playgroud)

我通过数据帧和输出试图环对中的基质细胞matrix["gene1","gene2"](例如,值进行比较时0.1250128 Xelaev15073085mXelaev15000002m).在单个基因的基础上这样做很容易,但是我在for循环中为这个列表中的数千对做这个尝试是失败的.在下面的示例中,headinglist是上面数据帧的样本,而FullcorSM是完整的相关矩阵.

for(i in headedlist$V1){
   data.frame(i, headedlist[i,2], FullcorSM[i,headedlist[i,2]])
}
Run Code Online (Sandbox Code Playgroud)

以上行是我的第一次尝试并返回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)
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*son 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
Run Code Online (Sandbox Code Playgroud)