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

如何使用for循环从矩阵中提取特定单元格?,r,for-loop,matrix,dataframe,R,For Loop,Matrix,Dataframe,搜索了几个不同的主题,但没有找到完全相同的问题。我有一个平方相关矩阵,其中行/列名是基因。下图所示的矩阵切片 Xelaev15073085m Xelaev15073088m Xelaev15073090m Xelaev15073095m Xelaev15000002m 0.1250128 -0.6368677 0.3119062 0.3980826 Xelaev15000006m 0.4127414

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

                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
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)
}
我有一个数据框,里面有我想从这个大矩阵中提取的成对基因

      V1              V2
1 Xelaev15011657m Xelaev15017932m
2 Xelaev15011587m Xelaev15046612m
3 Xelaev15011594m Xelaev15046616m
4 Xelaev15011597m Xelaev15046617m
5 Xelaev15011603m Xelaev15046624m
6 Xelaev15011654m Xelaev15017928m
我试图循环遍历数据帧并输出对
矩阵[“gene1”,“gene2”]
(例如,在比较
Xelaev15073085m
Xelaev15000002m
时,值为0.1250128)。在单基因的基础上做这件事很容易,但是我尝试用for循环来为列表中的数千对做这件事却失败了。在下面的示例中,headedlist是上面数据帧的一个示例,FullcorSM是完整的相关矩阵

for(i in headedlist$V1){
   data.frame(i, headedlist[i,2], FullcorSM[i,headedlist[i,2]])
}
上面这行是我第一次尝试,返回null。我的第二次尝试如下所示

                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
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如何解释矩阵/数据帧语法的知识,但我不清楚修复方法是什么。有关于如何继续的见解吗?

您尝试创建的功能实际上内置于R中。您可以使用另一个两列矩阵从矩阵中提取值,其中第一列表示行名称,第二列表示列名。例如:

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

您试图创建的功能实际上内置于R中。您可以使用另一个两列矩阵从矩阵中提取值,其中第一列表示行名称,第二列表示列名。例如:

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

远没有大卫·罗宾逊的非常好的解决方案那么干净。无论如何,在这里,在相关矩阵中,哪些基因在行中,哪些在列中,以及如果下标矩阵包含的组合不在相关矩阵中,这并不重要。与@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

远没有大卫·罗宾逊的非常好的解决方案那么干净。无论如何,在这里,在相关矩阵中,哪些基因在行中,哪些在列中,以及如果下标矩阵包含的组合不在相关矩阵中,这并不重要。与@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


我怀疑
match
和矩阵索引将允许您只需几行就可以做到这一点,而不需要循环。但是,如果没有关于矩阵的.Nice技巧,很难编写代码来提供帮助:实际上,您只需执行
FullcorSM[as.matrix(headedlist)]
即可得到值的向量。(也就是说,headedlist中的所有值实际上都以列名和/或行名的形式出现在矩阵中)。还要注意,第一次尝试仅返回
NULL
的原因是,您实际上没有对循环中选择的每个值执行任何操作
for
循环在隔离状态下只是函数(与R中的大多数其他东西一样),
NULL
是默认的返回值。这取决于您如何将值分配给某个对象以保存它们。否则,R只需查看每个值,说“是的,它在那里!”然后继续。@Joran,感谢您的澄清,将使用David的解决方案,但这将有助于我了解未来的循环。@sessmurda如果David的答案对您有效,您应该单击它旁边的小复选标记,这样将来的读者就会知道他的答案解决了你的问题。我想
match
和矩阵索引将允许你只需几行就可以做到这一点,而且没有循环。但是,如果没有关于矩阵的.Nice技巧,很难编写代码来提供帮助:实际上,您只需执行
FullcorSM[as.matrix(headedlist)]
即可得到值的向量。(也就是说,headedlist中的所有值实际上都以列名和/或行名的形式出现在矩阵中)。还要注意,第一次尝试仅返回
NULL
的原因是,您实际上没有对循环中选择的每个值执行任何操作
for
循环在隔离状态下只是函数(与R中的大多数其他东西一样),
NULL
是默认的返回值。这取决于您如何将值分配给某个对象以保存它们。否则,R只需查看每个值,说“是的,它在那里!”然后继续。@Joran,感谢您的澄清,将使用David的解决方案,但这将有助于我了解未来的循环。@sessmurda如果David的答案对您有效,您应该单击它旁边的小复选标记,好让未来的读者知道他的答案解决了你的问题。出于某种原因,我认为矩阵索引只适用于数字索引,而不适用于字符,这将使
匹配
成为必需。我想不会吧+1.您可能应该注意,如果您尝试使用原始矩阵中不存在的值(如OP示例中所示)进行子集,则会出现一个错误
下标超出范围
。+1!也许是个愚蠢的问题。。。在m中,哪些是行名称,哪些是列名重要吗?也就是说,它会在“相同”的相关矩阵上工作,但碰巧被转置了吗?@Henrik:除非矩阵是对称的,否则它是重要的!很好的小把戏,我一定会在未来利用。R充满了这么多漂亮的短处。出于某种原因,我认为矩阵索引只适用于数字索引,而不适用于字符,这将使
匹配
成为必需。我想不会吧+1.您可能应该注意,如果您尝试使用原始矩阵中不存在的值(如OP示例中所示)进行子集,则会出现一个错误
下标超出范围
。+1!也许是个愚蠢的问题。。。在m中,哪些是行名称,哪些是列名重要吗?也就是说,它会在“相同”的相关矩阵上工作吗