如何在R中正确使用drop = F以在子集化时保留矩阵结构

时间:2017-12-11 13:56:40

标签: r subset

我想在子集化后保留矩阵(或数组)结构,我的理解是这是通过参数drop = F实现的。但是,情况似乎并非如此:

> m = matrix(1:8, 4)             # Toy example
> m
     [,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    7
[4,]    4    8
> is.matrix(m[1:2,])             # Subsetting first 2 rows yields a matrix
[1] TRUE
> is.matrix(m[1,])               # Subsetting just one row yields a vector
[1] FALSE
> is.matrix(m[1,,drop=F])        # drop=F does not help!
[1] FALSE

1 个答案:

答案 0 :(得分:2)

根据?logical

  

TRUE和FALSE是表示R中逻辑常量的保留字   语言,而T和F是其初始值的全局变量   设置为这些。这四个都是逻辑(1)向量。

因此,正如我们在评论中提到的,如果我们使用&f;#F;之前然后使用drop=F,这将导致特定问题

F <- 1
is.matrix(m[1,,drop=F]) 
#[1] FALSE

对于这个特殊问题,最好使用TRUE/FALSE而不是子串T/F,因为我们不能将保留字分配为对象名,即

TRUE <- 5
  

TRUE错误&lt; - 5:无效(do_set)左侧分配

FALSE <- 1
  

FALSE错误&lt; - 1:无效(do_set)左侧分配

is.matrix(m[1,,drop=FALSE]) 
#[1] TRUE