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

时间:2011-10-06 09:00:17

标签: 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[1, ] # returns data frame
   X1 X2
a  x  u 

我不明白为什么数据帧上的相同操作会产生两种类型的结果,具体取决于帧的列数。

1 个答案:

答案 0 :(得分:11)

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

来自?"["

  


  对于矩阵和数组。如果为TRUE,则结果强制转换为   可能的最小尺寸(参见示例)。这只适用于   提取元素,而不是替换。请进一步了解   的信息。

> dat1 <- data.frame(x=letters[1:3])
> dat2 <- data.frame(x=letters[1:3], y=LETTERS[1:3])

默认行为:

> 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

使用drop=FALSE

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

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