在R中,如果数据帧只有一列,为什么从数据帧中选择行会将数据作为向量返回?

在R中,如果数据帧只有一列,为什么从数据帧中选择行会将数据作为向量返回?,r,dataframe,R,Dataframe,假设我们希望逐行访问数据帧中的数据。示例已简化,但当按行名称对数据帧进行排序时,例如(df[order(row.names(df)])我们使用相同的技术 如果数据帧有一列,则返回一个原子向量: > df x1 a x b y c z > df[1, ] # returns atomic vector [1] x 如果数据框有两列,我们将返回一个包含行名称的1行数据框: > df x1 x2 a x u b y v c z w

假设我们希望逐行访问数据帧中的数据。示例已简化,但当按行名称对数据帧进行排序时,例如(
df[order(row.names(df)]
)我们使用相同的技术

如果数据帧有一列,则返回一个原子向量:

> df
    x1
a   x
b   y
c   z

> df[1, ] # returns atomic vector
[1] x 
如果数据框有两列,我们将返回一个包含行名称的1行数据框:

> df
    x1 x2
a   x  u
b   y  v
c   z  w 

> df[1, ] # returns data frame
   X1 X2
a  x  u 

我不明白为什么对数据帧执行相同的操作会根据帧的列数产生两种类型的结果。

这是因为
[
的默认参数是
drop=TRUE

?“[”

下降
对于矩阵和数组。如果为TRUE,则结果强制为 可能的最小尺寸(参见示例)。这仅适用于 正在提取元素,不用于替换。有关详细信息,请参阅drop 细节

使用
drop=FALSE

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

> dat2[1, , drop=FALSE]
  x y
1 a A

相同的问题:这是“R地狱”圈8.1.45
> dat[1, ]
     row sessionId scenarionName stepName duration
[1,]   1      1001             A    start        0

> dat[2, ]
     row sessionId scenarionName stepName duration
[1,]   2      1001             A    step1      2.2
> dat1[1, , drop=FALSE]
  x
1 a

> dat2[1, , drop=FALSE]
  x y
1 a A