改变 data.frame() 行为

Tia*_*Qin 5 r dataframe

# example data
df <- structure(c(-1, 0, 0, -1, -1, 2), .Dim = 2:3)

# how it looks like
df

r$> df
     [,1] [,2] [,3]
[1,]   -1    0   -1
[2,]    0   -1    2

# construct a data.frame using two rows of df
data.frame(df[1:2, ])

r$> data.frame(df[1:2,])
  X1 X2 X3
1 -1  0 -1
2  0 -1  2

# construct a data.frame using only one row of df
data.frame(df[1, ])

r$> data.frame(df[1, ])
  df.1...
1      -1
2       0
3      -1
Run Code Online (Sandbox Code Playgroud)

data.frame(df[1:2,])与 具有相同的结构df,但data.frame(df[1, ])没有。

是否可以data.frame(df[1, ])创建一个只有一行而不是一列的数据框?

G. *_*eck 5

让我们将输入称为m“而不”,df因为它是一个矩阵而不是一个数据框。下面的两个解决方案具有适用于单行输入和多行输入的属性。对于这两种情况,它们不需要不同的代码。

1) drop=FALSE当索引矩阵时,有一个可选drop=参数,默认为 TRUE,这意味着标量索引的结果将删除维度,并将结果转换为普通向量。如果索引的长度 > 1,则 drop 不起作用。在这种情况下,我们总是得到一个矩阵。默认情况下以另一种方式表示,或者如果 drop = TRUE,则如果索引是标量,我们将得到一个向量,否则得到一个矩阵。如果 drop = FALSE 那么我们总是得到一个矩阵结果。因此,指定 drop=FALSE。

m <- structure(c(-1, 0, 0, -1, -1, 2), .Dim = 2:3)

m[1, ] # vector
## [1] -1  0 -1

m[1,, drop = TRUE] # same
## [1] -1  0 -1

m[1,, drop = FALSE] # matrix
##      [,1] [,2] [,3]
## [1,]   -1    0   -1

m[1:2,, drop = FALSE] # matrix
##      [,1] [,2] [,3]
## [1,]   -1    0   -1
## [2,]    0   -1    2
Run Code Online (Sandbox Code Playgroud)

现在,当我们应用 data.frame 时,我们会得到一行。

data.frame( m[1,, drop = FALSE] )
##   X1 X2 X3
## 1 -1  0 -1

data.frame(m[1:2,, drop = FALSE])
##   X1 X2 X3
## 1 -1  0 -1
## 2  0 -1  2
Run Code Online (Sandbox Code Playgroud)

2) rbind如果我们已经有了一个向量,以至于来不及使用 drop = FALSE 那么我们可以使用 rbind 来确保输入是一个矩阵。

data.frame(rbind(m[1, ]))
##   X1 X2 X3
## 1 -1  0 -1

data.frame(rbind(m[1:2, ]))
##   X1 X2 X3
## 1 -1  0 -1
## 2  0 -1  2
Run Code Online (Sandbox Code Playgroud)