# 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, ])创建一个只有一行而不是一列的数据框?
让我们将输入称为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)