0

我刚从 R 开始,遇到了以下问题。

以相同的方式使用方括号对数据框进行子集化似乎会产生向量或数据框。为什么会有这种差异?下面是我尝试子集的两个数据框。

matching我用 子集的第一个数据框matching[,1],它给了我一个只有一列的数据框。

> attributes(matching)
$names
[1] "A" "B" "C" "D" "E" "F" "G" "H"

$row.names
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
[50] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

$class
[1] "tbl_df"     "tbl"        "data.frame"

> matching[,1]
# A tibble: 67 x 1
       A
   <int>
 1     1
 2     2
 3     3
 4     4
 5     5
 6     6
 7     7
 8     8
 9     9
10    10
# ... with 57 more rows
> 

我子集的第二个数据框filesfiles[,1]它给了我一个向量

> attributes(files)
$names
[1] "names"

$row.names
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
[50] 50 51 52 53 54 55 56 57 58 59 60 61 62

$class
[1] "data.frame"

> files[,1]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
[50] 50 51 52 53 54 55 56 57 58 59 60 61 62

第一个是用read_excelexcel 文件创建的,第二个是用data.frame()字符串向量创建的。

谢谢!

4

1 回答 1

2

您可以从类中看到它matching是一个 tibble 并且files是一个数据框。这是 tibble 和 dataframe 对象之间的区别之一。

matching <- mtcars %>% as_tibble()
files <- mtcars

从 tibble 子集一列

matching[, 1]

# A tibble: 32 x 1
#     mpg
#   <dbl>
# 1  21  
# 2  21  
# 3  22.8
# 4  21.4
# 5  18.7
# 6  18.1
# 7  14.3
# 8  24.4
# 9  22.8
#10  19.2
# … with 22 more rows

从数据框中子集一列

files[, 1]
# [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 
#     10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 
#     15.0 21.4

当您对数据框进行子集化时,默认为drop = TRUE. 在?Extract你可以看到

drop - 如果为 TRUE,则结果被强制转换为可能的最低维度。

但是默认情况下 tibbles 有drop = FALSE. 在?"tbl_df-class"

df[, j] 返回一个小标题;它不会自动提取里面的列。df[, j, drop = FALSE] 是默认值。

要使数据框表现得像 tibble 你可以做

files[,1, drop = FALSE]
于 2020-01-09T05:06:12.913 回答