为什么对矩阵进行子集化会删除行或列名称信息?

时间:2015-12-16 14:43:41

标签: r which

对于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

但对于任何N&gt; 2矩阵,它返回:

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

为什么?这非常令人困惑。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

......在这个问题上花了一段时间

这与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

?drop

  

     

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