-
Notifications
You must be signed in to change notification settings - Fork 219
/
baseR_data_structure.Rmd
224 lines (136 loc) · 5.26 KB
/
baseR_data_structure.Rmd
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# 数据结构 {#baseR-data-structure}
前面介绍了向量,它是R语言中最基础的数据结构
```{r, out.width = '70%', echo = FALSE}
knitr::include_graphics("images/vector_like2.jpg", dpi = 300)
```
我们还会遇到其它数据结构
- 矩阵
- 列表
- 数据框
这些数据结构都可以看作由向量衍生出来的^[数据结构还包括array,但因为它的使用频次不及向量、矩阵、列表和数据框多,所以暂时不介绍。]。
## 矩阵
矩阵可以存储行(row)和列(column)二维的数据。
```{r, out.width = '50%', echo = FALSE}
knitr::include_graphics("images/matrix.jpg", dpi = 300)
```
它实际上是向量的另一种表现形式,也就说它的本质还是向量,一维的向量用二维的方式呈现。
矩阵可以用 `matrix()` 函数创建,第一个位置的参数是用于创建矩阵的向量。比如下面把向量`c(2, 4, 3, 1, 5, 7)` 转换成2行3列的矩阵
```{r, echo=TRUE, message=TRUE, warning=TRUE}
m <- matrix(
c(2, 4, 3, 1, 5, 7),
nrow = 2,
ncol = 3
)
m
```
```{r, echo=FALSE, out.width = '100%'}
knitr::include_graphics("images/create_matrix.jpg", dpi = 300)
```
大家还记得我们的向量是一个竖着的糖葫芦, 那么在转换成矩阵的时候,也是先竖着排,第一列竖着的方法排满后,就排第二列,这是默认的情形。如果想改变这一传统习惯,也可以增加一个语句 `byrow = TRUE`,这条语句让向量先横着排,排完第一行,再排第二行。
```{r}
matrix(
c(2, 4, 3, 1, 5, 7),
nrow = 2,
ncol = 3,
byrow = TRUE
)
```
### 矩阵的属性
- 类型
```{r}
class(m)
```
- 长度
```{r}
length(m)
```
- 维度
```{r}
dim(m)
```
## 列表
如果我们想要装更多的东西,可以想象有一个小火车^[列表与向量一样,也是竖着的,但为了方便大家理解,我这里把它横过来看,就像一个小火车],小火车的每节车厢是独立的,因此每节车厢装的东西可以不一样。这种结构装载数据的能力很强大,称之为**列表**(list)。我们可以使用`list()`函数创建列表
```{r, out.width = '95%', echo = FALSE}
knitr::include_graphics("images/list_trian.png")
```
```{r, echo=TRUE, message=TRUE, warning=TRUE}
list1 <- list(
a = c(5, 10),
b = c("I", "love", "R", "language", "!"),
c = c(TRUE, TRUE, FALSE, TRUE)
)
list1
```
```{r, out.width = '100%', echo = FALSE}
knitr::include_graphics("images/create_list.jpg")
```
<!-- ::: {.rmdnote} -->
<!-- `list()` 函数创建列表 Vs. `c()` 函数创建向量: -->
<!-- - **相同点**:元素之间用逗号分开。 -->
<!-- - **不同点**: -->
<!-- - 向量的元素是单个值;列表的元素可以是更复杂的结构,可以是单个值,也可以是向量、矩阵或者列表。 -->
<!-- - 向量要求每个元素的数据类型必须相同,要么都是数值型,要么都是字符型;而列表的元素允许不同的数据类型。 -->
<!-- ::: -->
`c()` 函数创建向量 对比 `list()` 函数创建列表
```{r, out.width = '100%', echo = FALSE}
knitr::include_graphics("images/c_vs_list.png", dpi = 300)
```
### 列表的属性
- 类型
```{r}
class(list1)
```
- 长度
```{r}
length(list1)
```
## 数据框
前面说过,列表可以想象成一个小火车,如果每节车厢装的**都是向量而且等长**,那么这种特殊形式的列表就变成了**数据框** (data frame)
```{r, out.width = '100%', echo = FALSE}
knitr::include_graphics("images/dataframe.jpg", dpi = 300)
```
换句话说,**数据框**是一种特殊的列表,我们可以使用 `data.frame()` 函数构建数据框
```{r, echo=TRUE, message=TRUE, warning=TRUE}
df <- data.frame(
name = c("Alice", "Bob", "Carl", "Dave"),
age = c(23, 34, 23, 25),
marriage = c(TRUE, FALSE, TRUE, FALSE),
color = c("red", "blue", "orange", "purple")
)
df
```
```{r, echo=FALSE, out.width = '100%'}
knitr::include_graphics("images/create_dataframe.png")
```
数据框类似于我们经常用的excel表格。由于数据框融合了向量、列表和矩阵的特性,所以在数据科学的统计建模和可视化中运用非常广泛。
### 数据框的属性
- 类型
```{r}
class(df)
```
- 维度
```{r}
nrow(df)
ncol(df)
```
### 数据框 vs 矩阵
数据框(data frame) 和 矩阵(matrix) 都用来表示二维数据, 即长方形的, 按"行"和"列"排列的数据。
数据框和矩阵两者主要区别在于,矩阵中的元素必须是相同的数据类型,而数据框则可以由多种类型的数据构成。
## 小结
R 对象的数据结构(向量、矩阵、列表和数据框),总结如下
- 向量: 糖葫芦
- 矩阵: 糖葫芦,有多行多列
- 列表: 小火车
- 数据框: excel表格
<!-- - array: 土司面包一样 -->
```{r, out.width = '90%', include = FALSE}
knitr::include_graphics("images/data_structure.jpg")
```
```{r, out.width = '90%', echo = FALSE}
knitr::include_graphics("images/data_structure1.png")
```
为了更好地理解相关概念,建议大家阅读Garrett Grolemund的
[hopr](https://rstudio-education.github.io/hopr/)这本书 [@Garrett2014]。
## 习题
- 为什么说数据框融合了向量、矩阵和列表的特性?
- 创建一个学生信息的data.frame,包含姓名、性别、年龄,成绩等变量。