1

假设我有一个包含 N 列的矩阵 A,并且我从该矩阵中取出 2 个(或任何子集)列来构造一个新矩阵 B,例如:

B = cbind(A[,1], A[,3]) 

是否可以添加一个简单的参数,以便传输两列的标题名称?使用names(B) = names(A)不起作用,因为矩阵的维度不同。

4

2 回答 2

3

一个例子会很有帮助,因为我怀疑您可能正在使用您错误地调用矩阵的数据框。我这么说是因为与矩阵一起使用的 names<- 函数会破坏矩阵结构。修改列名的正确函数是colnames<-. 此外,如果您使用“[”函数从矩阵中提取列,则几乎不可能列名不会与值一起出现:

> mat <- matrix(1:9, 3)
> colnames(mat) <- letters[1:3]
> mat[ , 2:3]
     b c
[1,] 4 7
[2,] 5 8
[3,] 6 9

回应您的评论,最好这样做:

B <- A[ , c(1,3) ]

然后您的列名将被正确继承。(补充说明:我很惊讶您的 cbind 操作没有将 col.names 带过来,并想知道为什么会这样。在 cbind 中使用“[”的这个版本确实保留了 col.names:

> B=cbind( A[,1,drop=FALSE], A[,3,drop=FALSE])
> B
     a c
[1,] 1 7
[2,] 2 8
[3,] 3 9

"[" 函数将强制单个列或行到一个原子向量,并且显然也失去了它的 dimnames 属性。drop=FALSE防止这种损失。

于 2012-12-13T18:15:27.343 回答
1

您可以将子集与“选择”一起使用?subset

 B <- subset(A,select = c(col1,col2))  

例如

 A <- mtcars
 B <- subset(A,select = c(mpg,cyl))

                      mpg cyl
Mazda RX4         21.0   6
Mazda RX4 Wag     21.0   6
Datsun 710        22.8   4
Hornet 4 Drive    21.4   6
Hornet Sportabout 18.7   8
Valiant           18.1   6

如果你按索引做:

      B=cbind(A[,1],A[,3])
      colnames(B) <- colnames(A)[c(1,3)]
于 2012-12-13T18:13:14.197 回答