R 为什么子集矩阵会删除行或列名信息?

R 为什么子集矩阵会删除行或列名信息?,r,R,对于N=2的N*N矩阵,在以下示例中仅返回最大值: d2<-matrix(1:4,nrow=2,ncol=2) rownames(d2)<-c("a","b") colnames(d2)<-c("d","e") which.max(d2[which(rownames(d2)!="a"),which(colnames(d2)=="d")]) #returns: [1] 1 rownames(as.matrix(which.max(d2[which(rownames(d2)!="a

对于N=2的N*N矩阵,在以下示例中仅返回最大值:

d2<-matrix(1:4,nrow=2,ncol=2)
rownames(d2)<-c("a","b")
colnames(d2)<-c("d","e")
which.max(d2[which(rownames(d2)!="a"),which(colnames(d2)=="d")])
#returns:
[1] 1
rownames(as.matrix(which.max(d2[which(rownames(d2)!="a"),which(colnames(d2)=="d")])))
#returns
NULL

d2…这一次我花了一些时间

这与R正在本机删除冗余信息这一事实有关。有更多时间的人可能能够提供更完整的答案。但这就是原因:

> d3[which(rownames(d3)!="a"),which(colnames(d3)=="d"), drop=FALSE]
  d
b 2
c 3
> d2[which(rownames(d2)!="a"),which(colnames(d2)=="d"), drop=FALSE]
  d
b 2
> d3[which(rownames(d3)!="a"),which(colnames(d3)=="d")]
b c 
2 3 
> d2[which(rownames(d2)!="a"),which(colnames(d2)=="d")]
[1] 2
> as.matrix(d2[which(rownames(d2)!="a"),which(colnames(d2)=="d")])
     [,1]
[1,]    2
> as.matrix(d3[which(rownames(d3)!="a"),which(colnames(d3)=="d")])
  [,1]
b    2
c    3
?放下

价值观

如果x是具有dim属性的对象(例如,矩阵或数组),则drop将返回类似于x的对象,但删除长度为1的任何范围调整任何附带的dimnames属性并返回x:如果结果是向量,则名称取自dimnames(如果有)。如果结果是一个长度为1的向量,则名称将从第一个维度使用dimname。数组子集(
[
)执行此缩减,除非与drop=FALSE一起使用,但有时直接调用drop很有用


这与as.dist()有什么关系
或距离矩阵?我同意你的观点,在R文档或教程中,drop标志应该更突出一点。应该注意的是,R中的实际行为与数学文献更为一致,在数学文献中,名称行或列向量仅用于描述嵌入数组。向量作为数学对象只有长度。我还想评论一下,不必使用列名或列名来子集,只需使用列名或列名。谢谢Alex和@Jonathan,这确实澄清了问题!
> d3[which(rownames(d3)!="a"),which(colnames(d3)=="d"), drop=FALSE]
  d
b 2
c 3
> d2[which(rownames(d2)!="a"),which(colnames(d2)=="d"), drop=FALSE]
  d
b 2
> d3[which(rownames(d3)!="a"),which(colnames(d3)=="d")]
b c 
2 3 
> d2[which(rownames(d2)!="a"),which(colnames(d2)=="d")]
[1] 2
> as.matrix(d2[which(rownames(d2)!="a"),which(colnames(d2)=="d")])
     [,1]
[1,]    2
> as.matrix(d3[which(rownames(d3)!="a"),which(colnames(d3)=="d")])
  [,1]
b    2
c    3