假设我有一个包含 N 列的矩阵 A,并且我从该矩阵中取出 2 个(或任何子集)列来构造一个新矩阵 B,例如:
B = cbind(A[,1], A[,3])
是否可以添加一个简单的参数,以便传输两列的标题名称?使用names(B) = names(A)
不起作用,因为矩阵的维度不同。
假设我有一个包含 N 列的矩阵 A,并且我从该矩阵中取出 2 个(或任何子集)列来构造一个新矩阵 B,例如:
B = cbind(A[,1], A[,3])
是否可以添加一个简单的参数,以便传输两列的标题名称?使用names(B) = names(A)
不起作用,因为矩阵的维度不同。
一个例子会很有帮助,因为我怀疑您可能正在使用您错误地调用矩阵的数据框。我这么说是因为与矩阵一起使用的 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
防止这种损失。
您可以将子集与“选择”一起使用?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)]