为什么具有1列的R表与具有多于1的列的访问方式不同?

Ter*_*rry 5 r

似乎在访问具有1列的表时,访问的操作会抛弃列信息.如果有超过1列,则保留此信息.

例如

表中有1个项目:

> example1 <- data.frame( items = c("A","B","B","C","C","C","C")
+                       , time = ISOdate(2222,1,1) )
> table1 <- table(example1)
> table1
     time
items 2222-01-01 12:00:00
    A                   1
    B                   2
    C                   4

> barplot(table1, legend=T)
> table1.ordered <- table1[c(3,2,1),]   # reorder
> table1.ordered
C B A 
4 2 1 
> barplot(table1.ordered, legend=T) # time column thrown away
Run Code Online (Sandbox Code Playgroud)

现在表中有2个项目 :( 在此示例中添加到example1)

> example2 <- rbind(example1 , data.frame(items = NA, time = ISOdate(3333,1,1)) )
> example2
  items                time
1     A 2222-01-01 12:00:00
2     B 2222-01-01 12:00:00
3     B 2222-01-01 12:00:00
4     C 2222-01-01 12:00:00
5     C 2222-01-01 12:00:00
6     C 2222-01-01 12:00:00
7     C 2222-01-01 12:00:00
8  <NA> 3333-01-01 12:00:00

> table2 <- table(example2)
> table2
     time
items 2222-01-01 12:00:00 3333-01-01 12:00:00
    A                   1                   0
    B                   2                   0
    C                   4                   0
> table2.ordered <- table2[c(3,2,1),]    #Again, reorder
> table2.ordered
     time
items 2222-01-01 12:00:00 3333-01-01 12:00:00
    C                   4                   0
    B                   2                   0
    A                   1                   0
> barplot(table2.ordered, legend=T)    #displays how I expected
Run Code Online (Sandbox Code Playgroud)

Jor*_*eys 8

旧的默认drop=TRUE问题......

重新排序的结果是表格被转换为向量.如果你看一下它的结构table1,你会发现它实际上是一个带有一列(计数)的矩阵,时间和项目都是维度的名称.这些是属性,而不是矩阵的一部分.

使用重新排序也将使用默认drop=TRUE[功能.因此只有一列的矩阵被转换为矢量.随后,也会删除列(时间)的name属性.

您可以通过以下方式避免此

table1.ordered <- table1[c(3,2,1),,drop=FALSE]   # reorder
table1.ordered

     time
items 2222-01-01 12:00:00
    C                   4
    B                   2
    A                   1
Run Code Online (Sandbox Code Playgroud)

该参数drop=TRUE允许[函数下降维数为1.在这种情况下,矩阵被简化为向量.如果您不希望发生这种情况,则必须使用drop=FALSE.另一个例子 :

> X <- matrix(1:4,ncol=2)
> X[,1]
[1] 1 2
> X[,1,drop=FALSE]
     [,1]
[1,]    1
[2,]    2
Run Code Online (Sandbox Code Playgroud)