每天一个R语言小技巧(2)———matrix求子集

问题

>  x=matrix(1:10,ncol=5)
>  colnames(x)=letters[1:5]
>  x
     a b c d  e
[1,] 1 3 5 7  9
[2,] 2 4 6 8 10

(觉得问题太基础了跳过就ok)

  1. 如何得到第一行,第二四列的x的子集?
  2. x[TRUE,1:2] 输出的结果应该是什么呢?
  3. 当筛选出来的x的子集是一行或者一列时,该子集的数据类型是什么?

答案

1.

通用:

> x[1,c(2,4)]
b d 
3 7 

若矩阵已命名:

> x[1,c("c","d")]
c d 
5 7 

2.

返回1:2列的所有行,相当于x[,1:2]
(注意不是x[1,1:2],这里的true是当logical变量用的!!)

> x[TRUE,1:2]
     a b
[1,] 1 3
[2,] 2 4

3.

举个例子,下面得到的分别为第1行与第1&2行的元素

> x[1,]
a b c d e 
1 3 5 7 9 

> x[1:2,]
     a b c d  e
[1,] 1 3 5 7  9
[2,] 2 4 6 8 10

以上的输出结果,发现什么不同么?
再举一个例子

> x[,1]
[1] 1 2

> x[,1:2]
     a b
[1,] 1 3
[2,] 2 4

结论:当子集只有一行或一列时,会由matrix结构转变成vector结构。
(x[,1]的例子还是很明显的)

这种悄咪咪的转换在实际使用时还是会造成一些麻烦的,那如果我不想让subset自己偷偷转换为vector呢?
使用参数drop=FALSE

> x[,1]
[1] 1 2

> x[,1,drop=FALSE]
     a
[1,] 1
[2,] 2

轻松get矩阵格式 √

猜你喜欢

转载自blog.csdn.net/ptyp222/article/details/106586280