forked from datacamp/courses-introduction-to-r
-
Notifications
You must be signed in to change notification settings - Fork 1
/
chapter6.Rmd
476 lines (339 loc) · 33.4 KB
/
chapter6.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
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
---
title_meta : บทที่ 6
title : Lists
description : List แตกต่างจาก vector ตรงที่มันสามารถเก็บข้อมูลหลากหลายประเภทไว้ด้วยกันได้ เนื้อหาในบทนี้จะสอนให้คุณรู้จักการสร้าง ตั้งชื่อ และเลือกข้อมูลจาก list!
--- type:NormalExercise xp:100 skills:1 key:2afcdb6a76ec91bf266de9b2ac295d844d7bb004
## ทำไมคุณถึงต้องใช้ List?
ยินดีด้วย! ณ จุดนี้คุณน่าจะคุ้นเคยกับข้อมูลประเภทต่างๆเหล่านี้ใน R แล้ว:
- **Vector** (1 มิติ): สามารถเก็บข้อมูลประเภท numeric, character หรือ logical ได้ โดยที่ข้อมูลทุกตัวต้องเป็นประเภทเดียวกัน
- **Matrix** (2 มิติ): สามารถเก็บข้อมูลประเภท numeric, character หรือ logical ได้ โดยที่ข้อมูลทุกตัวต้องเป็นประเภทเดียวกัน
- **Data frame** (2 มิติ): สามารถเก็บข้อมูลประเภท numeric, character หรือ logical ได้ ข้อมูลในแต่ละคอลัมน์ต้องเป็นประเภทเดียวกัน แต่สามารถเก็บข้อมูลต่างประเภทไว้คนละคอลัมน์ได้
หวังว่าคุณจะยังจำได้นะ
`@instructions`
กดปุ่ม 'Submit Answer' เพื่อเริ่มเรียนรู้เกี่ยวกับ list!
`@hint`
แค่กดปุ่ม 'Submit Answer' ก็พอ
`@pre_exercise_code`
```{r}
# no pec
```
*** =sample_code
```{r}
# Just click the 'Submit Answer' button.
```
*** =solution
```{r}
# Just click the 'Submit Answer' button.
```
`@sct`
```{r}
msg <- "พร้อมหรือยัง? เราจะเริ่มกันแล้ว!"
# พร้อมหรือยัง? เราจะเริ่มกันแล้ว!
success_msg(msg)
```
--- type:NormalExercise xp:100 skills:1 key:68f93c5c504616bd18876da52cd123277d56fc8b
## ทำไมคุณถึงต้องใช้ List? (2)
**list** ในภาษา R ก็คล้ายๆกับ to-do list หรือรายการสิ่งที่ต้องทำที่คุณใช้อยู่ในชีวิตประจำวัน แต่ละกิจกรรมก็อาจจะมีความยาว ประเภท และลักษณะงานที่แตกต่างกันออกไป
โครงสร้างข้อมูลแบบ list ทำให้คุณสามารถเก็บและเรียงลำดับข้อมูลที่มีโครงสร้างต่างๆกันไว้ด้วยกันได้ โดยข้อมูลเหล่านี้สามารถเป็นได้ทั้ง matrix, vector, data frame หรือแม้กระทั่ง list อีกอันหนึ่ง และข้อมูลแต่ละชุดก็ไม่จำเป็นต้องมีความเกี่ยวข้องกันด้วย
หรือเราอาจจะพูดได้ว่า list นั้นเป็นโครงสร้างข้อมูลแบบพิเศษแบบหนึ่ง ที่เราสามารถเก็บอะไรไว้ข้างในก็ได้!
`@instructions`
กดปุ่ม 'Submit Answer' เพื่อเริ่มแบบฝึกหัดแรก!
`@hint`
แค่กดปุ่ม 'Submit Answer' ก็พอ
`@pre_exercise_code`
```{r}
# no pec
```
*** =sample_code
```{r}
# Click 'Submit Answer' to start the first exercise on lists.
```
*** =solution
```{r}
# Click 'Submit Answer' to start the first exercise on lists.
```
`@sct`
```{r}
msg <- "ดี! คราวนี้เรามาเริ่มทำแบบฝึกหัดกันดีกว่า"
# ดี! คราวนี้เรามาเริ่มทำแบบฝึกหัดกันดีกว่า
success_msg(msg)
```
--- type:NormalExercise xp:100 skills:1 key:4beee9cb532c889903218b49b83ab5ef133eac83
## การสร้าง List
เรามาลองสร้าง list ตัวแรกกัน! ในการสร้าง list ให้คุณใช้ function [`list()`](http://www.rdocumentation.org/packages/base/functions/list):
```
my_list <- list(comp1, comp2 ...)
```
ค่าที่ใส่เข้าไปใน function list() คือส่วนประกอบของ list ที่เรากำลังจะสร้างขึ้น จำไว้ว่าส่วนประกอบเหล่านี้สามารถเป็นได้ทั้ง matrix, vector, หรือ list อื่นๆ ก็ได้
`@instructions`
สร้าง list ที่ชื่อว่า `my_list` ซึ่งประกอบไปด้วย `my_vector`, `my_matrix` และ `my_df`
`@hint`
ใช้ function [`list()`](http://www.rdocumentation.org/packages/base/functions/list) โดยมี `my_vector`, `my_matrix` และ `my_df` เป็น arguments ตามลำดับ
`@pre_exercise_code`
```{r}
# no pec
```
*** =sample_code
```{r}
# Vector with numerics from 1 up to 10
my_vector <- 1:10
# Matrix with numerics from 1 up to 9
my_matrix <- matrix(1:9, ncol = 3)
# First 10 elements of the built-in data frame mtcars
my_df <- mtcars[1:10,]
# Construct list with these different elements:
my_list <-
```
*** =solution
```{r}
# Vector with numerics from 1 up to 10
my_vector <- 1:10
# Matrix with numerics from 1 up to 9
my_matrix <- matrix(1:9, ncol = 3)
# First 10 elements of the built-in data frame mtcars
my_df <- mtcars[1:10,]
# Construct list with these different elements:
my_list <- list(my_vector, my_matrix, my_df)
```
`@sct`
```{r}
msg <- paste("อย่าลบหรือเปลี่ยนแปลงรายละเอียดของตัวแปร", "`my_vector`, `my_matrix`", "หรือ", "`my_df`!")
# อย่าลบหรือเปลี่ยนแปลงรายละเอียดของตัวแปร `my_vector`, `my_matrix` หรือ `my_df`!
incorrect_msg <- paste("ดูเหมือนตัวแปร", "`my_list`", "จะยังมีค่าไม่ถูกต้อง ลองตรวจสอบให้แน่ใจว่าคุณได้ใส่", "`my_vector`, `my_matrix`", "และ", "`my_df`", "ลงไปใน function", "`list()`", "ตามลำดับ (คั่นด้วย", "`,`)", "แบบเรียงตามลำดับเรียบร้อยแล้ว")
# ดูเหมือนตัวแปร `my_list` จะยังมีค่าไม่ถูกต้อง ลองตรวจสอบให้แน่ใจว่าคุณได้ใส่ `my_vector`, `my_matrix` และ `my_df` ลงไปใน function `list()` ตามลำดับ (คั่นด้วย `,`)
success_msg <- "เยี่ยมมาก! ไปแบบฝึกหัดต่อไปกันเลย"
# เยี่ยมมาก! ไปแบบฝึกหัดต่อไปกันเลย
test_object("my_vector", undefined_msg = msg, incorrect_msg = msg)
test_object("my_matrix", undefined_msg = msg, incorrect_msg = msg)
test_object("my_df", undefined_msg = msg, incorrect_msg = msg)
test_object("my_list", incorrect_msg = incorrect_msg)
success_msg(success_msg)
```
--- type:NormalExercise xp:100 skills:1 key:89dd0126568b1ff5a84033c571907a8a282245e4
## การสร้าง List แบบกำหนดชื่อ
คุณทำได้ดีทีเดียวในแบบฝึกหัดที่แล้ว!
เพื่อไม่ให้ลืมว่าข้อมูลแต่ละชุดใน list คืออะไร เราสามารถตั้งชื่อให้กับมันได้ตอนสร้าง list ดังตัวอย่าง:
```
my_list <- list(name1 = your_comp1,
name2 = your_comp2)
```
ผลลัพธ์ที่ได้คือ list ที่ประกอบไปด้วยข้อมูลชื่อ `name1` และ `name2` ในกรณีที่คุณต้องการตั้งชื่อให้กับส่วนประกอบของ list หลังจากที่คุณได้สร้าง list ไปแล้ว คุณสามารถใช้ function `names()` เหมือนกับที่คุณเคยใช้ตั้งชื่อข้อมูลใน vector ลองดูโค้ดด้านล่างนี้ซึ่งให้ผลลัพธ์เหมือนกันกับตัวอย่างที่แล้ว:
```
my_list <- list(your_comp1, your_comp2)
names(my_list) <- c("name1", "name2")
```
`@instructions`
- ลองปรับเปลี่ยนโค้ดของแบบฝึกหัดก่อนหน้านี้ (ใน editor) ด้วยการเพิ่มชื่อให้กับส่วนประกอบของ `my_list` โดยให้คุณตั้งชื่อ `my_vector`, `my_matrix` และ `my_df` ว่า `vec`, `mat` และ `df` ตามลำดับ
- แสดงค่า `my_list` เพื่อที่คุณจะได้เห็นว่าผลลัพธ์หลังการตั้งชื่อเป็นอย่างไร
`@hint`
การสร้าง list แบบกำหนดชื่อ สามารถทำได้โดยใช้คำสั่ง:
```
my_list <- list(vec = my_vector)
```
ลองเติมข้อมูลที่เหลือเข้าไปใน list ให้ถูกต้อง
`@pre_exercise_code`
```{r}
# no pec
```
*** =sample_code
```{r}
# Vector with numerics from 1 up to 10
my_vector <- 1:10
# Matrix with numerics from 1 up to 9
my_matrix <- matrix(1:9, ncol = 3)
# First 10 elements of the built-in data frame mtcars
my_df <- mtcars[1:10,]
# Adapt list() call to give the components names
my_list <- list(my_vector, my_matrix, my_df)
# Print out my_list
```
*** =solution
```{r}
# Vector with numerics from 1 up to 10
my_vector <- 1:10
# Matrix with numerics from 1 up to 9
my_matrix <- matrix(1:9, ncol = 3)
# First 10 elements of the built-in data frame mtcars
my_df <- mtcars[1:10,]
# Adapt list() call to give the components names
my_list <- list(vec = my_vector, mat = my_matrix, df = my_df)
# Print out my_list
my_list
```
`@sct`
```{r}
msg <- paste("อย่าลบหรือเปลี่ยนแปลงรายละเอียดของตัวแปร", "`my_vector`, `my_matrix`", "หรือ", "`my_df`!")
# อย่าลบหรือเปลี่ยนแปลงรายละเอียดของตัวแปร `my_vector`, `my_matrix` หรือ `my_df`!
object_msg_1 <- paste("ดูเหมือนข้อมูลใน", "`my_list`", "จะยังไม่ถูกต้อง")
# ดูเหมือนข้อมูลใน `my_list` จะยังไม่ถูกต้อง
object_msg_2 <- paste("ดูเหมือนชื่อของข้อมูลใน", "`my_list`", "จะยังไม่ถูกต้อง ตรวจสอบให้แน่ใจว่าคุณได้ตั้งชื่อให้กับข้อมูลแต่ละตัวว่า", "`vec`, `mat`", "และ", "`df`", "ตามลำดับ")
# ดูเหมือนชื่อของข้อมูลใน `my_list` จะยังไม่ถูกต้อง ตรวจสอบให้แน่ใจว่าคุณได้ตั้งชื่อให้กับข้อมูลแต่ละตัวว่า `vec`, `mat` และ `df` ตามลำดับ
output_msg <- paste("อย่าลืมสั่งแสดงค่า", "`my_list`", "บน Console ด้วย! แค่พิมพ์", "`my_list`", "ลงไปใน editor ก็พอ")
# อย่าลืมสั่งแสดงค่า `my_list` บน Console ด้วย! แค่พิมพ์ `my_list` ลงไปใน editor ก็พอ
success_msg <- "ดีมาก! นอกจากคุณจะสร้าง list เป็นแล้ว ตอนนี้คุณยังสามารถตั้งชื่อให้ส่วนประกอบของมันได้ด้วย! ไปต่อที่แบบฝึกหัดต่อไปกันเลย"
# ดีมาก! นอกจากคุณจะสร้าง list เป็นแล้ว ตอนนี้คุณยังสามารถตั้งชื่อให้ส่วนประกอบของมันได้ด้วย! ไปต่อที่แบบฝึกหัดต่อไปกันเลย
test_object("my_vector", undefined_msg = msg, incorrect_msg = msg)
test_object("my_matrix", undefined_msg = msg, incorrect_msg = msg)
test_object("my_df", undefined_msg = msg, incorrect_msg = msg)
test_object("my_list", incorrect_msg = object_msg_1)
test_object("my_list", eq_condition = "equal", incorrect_msg = object_msg_2);
test_output_contains("my_list", incorrect_msg = output_msg)
success_msg(success_msg)
```
--- type:NormalExercise xp:100 skills:1 key:19fd17cc792ef870c1558b3a9bae08c1d1e3acae
## การสร้าง List แบบกำหนดชื่อ (2)
ด้วยความที่เป็นคนชอบดูหนัง อยู่ดีๆคุณก็เกิดอยากจะเก็บข้อมูลต่างๆเกี่ยวกับภาพยนตร์เรื่อง "The Shining" ขึ้นมา
เริ่มจากการสร้าง list สำหรับเก็บข้อมูลกันก่อน เราได้สร้างตัวแปร `mov`, `act` และ `rev` ไว้ให้คุณใน workspace แล้ว ลองตรวจสอบค่าของตัวแปรเหล่านี้ได้โดยการพิมพ์ชื่อตัวแปรลงไปใน Console
`@instructions`
เขียนโค้ดสำหรับสร้างตัวแปร `shining_list` โดยมีส่วนประกอบ 3 ตัวดังต่อไปนี้:
- moviename: ข้อมูลแบบตัวอักษร แสดงถึงชื่อภาพยนตร์ (ถูกเก็บไว้ในตัวแปร `mov` แล้ว)
- actors: vector ที่เก็บรายชื่อนักแสดงหลักเอาไว้ (ถูกเก็บไว้ในตัวแปร `act` แล้ว)
- reviews: data frame ที่มีข้อมูลความคิดเห็นจากผู้ชม (ถูกเก็บไว้ในตัวแปร `rev` แล้ว)
อย่าลืมตั้งชื่อให้กับข้อมูลแต่ละตัวตามที่กำหนดให้ด้วย (moviename, actors และ reviews)
`@hint`
คำสั่ง `shining_list <- list(moviename = mov)` เป็นแค่ส่วนหนึ่งของคำตอบ คุณจะต้องเพิ่มข้อมูล `act` และ `rev` ลงไปใน list และตั้งชื่อให้ถูกต้อง
`@pre_exercise_code`
```{r}
mov <- "The Shining"
act <- c("Jack Nicholson","Shelley Duvall","Danny Lloyd","Scatman Crothers","Barry Nelson")
sources <- c("IMDb1","IMDb2","IMDb3")
comments <- c("Best Horror Film I Have Ever Seen","A truly brilliant and scary film from Stanley Kubrick","A masterpiece of psychological horror")
scores <- c(4.5,4,5)
rev <- data.frame(scores, sources, comments)
rm(scores, sources, comments)
```
*** =sample_code
```{r}
# The variables mov, act and rev are available
# Finish the code to build shining_list
shining_list <- list(moviename = mov)
```
*** =solution
```{r}
# The variables mov, act and rev are available
# Finish the code to build shining_list
shining_list <- list(moviename = mov, actors = act, reviews = rev)
```
`@sct`
```{r}
msg <- "อย่าลบหรือเปลี่ยนแปลงรายละเอียดของตัวแปรที่ถูกสร้างไว้ให้แล้ว!"
# อย่าลบหรือเปลี่ยนแปลงรายละเอียดของตัวแปรที่ถูกสร้างไว้ให้แล้ว!
lapply(c("mov", "rev", "act"), test_object, undefined_msg = msg, incorrect_msg = msg)
object_msg_1 <- paste("ดูเหมือนข้อมูลใน", "`shining_list`", "จะยังไม่ถูกต้อง ในการสร้าง list ดังกล่าว คุณควรใส่", "`mov`, `act`", "และ", "`rev`", "ลงไปตามลำดับ")
# ดูเหมือนข้อมูลใน `shining_list` จะยังไม่ถูกต้อง ในการสร้าง list ดังกล่าว คุณควรใส่ `mov`, `act` และ `rev` ลงไปตามลำดับ
object_msg_2 <- paste("ดูเหมือนชื่อของข้อมูลใน", "`shining_list`", "จะยังไม่ถูกต้อง คุณต้องตั้งชื่อข้อมูลว่า", "`moviename`, `actors`", "และ", "`reviews`", "ตามลำดับ")
# ดูเหมือนชื่อของข้อมูลใน `shining_list` จะยังไม่ถูกต้อง คุณต้องตั้งชื่อข้อมูลว่า `moviename`, `actors` และ `reviews` ตามลำดับ
success_msg <- "เยี่ยมมาก! ตอนนี้คุณก็รู้วิธีการสร้าง list พร้อมกับตั้งชื่อให้ข้อมูลแล้ว ในแบบฝึกหัดต่อไปเราจะได้เรียนรู้วิธีการเลือกข้อมูลจาก list กัน!"
# เยี่ยมมาก! ตอนนี้คุณก็รู้วิธีการสร้าง list พร้อมกับตั้งชื่อให้ข้อมูลแล้ว ในแบบฝึกหัดต่อไปเราจะได้เรียนรู้วิธีการเลือกข้อมูลจาก list กัน!
test_object("shining_list", incorrect_msg = object_msg_1)
test_object("shining_list", eq_condition = "equal", incorrect_msg = object_msg_2);
success_msg(success_msg)
```
--- type:NormalExercise xp:100 skills:1 key:1ef3278944562caef64b9927dd2ddb6ee52334cd
## การเลือกข้อมูลจาก List
List ของคุณมักจะประกอบไปด้วยข้อมูลหลากหลายชุด แต่ละชุดก็อาจจะมีโครงสร้างที่ซับซ้อนลงไปอีก การจะเลือกข้อมูลแต่ละตัวออกมาจึงอาจจะไม่ใช่เรื่องง่าย
วิธีหนึ่งในการเลือกข้อมูลจาก list คือการใช้เลขตำแหน่งของข้อมูลนั้น ตัวอย่างเช่น ถ้าต้องการข้อมูลตัวแรกสุดของ `shining_list` คุณสามารถใช้คำสั่ง:
```
shining_list[[1]]
```
คุณสามารถลองใช้งานคำสั่งดังกล่าวได้โดยการพิมพ์ลงไปใน Console สังเกตให้ดีว่าตอนที่คุณเลือกข้อมูลจาก vector ในบทเรียนก่อนหน้านี้นั้น คุณใช้ square brackets (`[ ]`) เพียงแค่ชั้นเดียว อย่าสับสนละ
นอกจากนี้คุณยังสามารถเลือกข้อมูลโดยการใช้ชื่อของข้อมูลนั้นๆ ร่วมกับ square brackets 2 ชั้น (`[[ ]]`) หรือเครื่องหมาย `$` ก็ได้ ตัวอย่างเช่น ในการเลือก data frame ที่เก็บความคิดเห็นของผู้ชม คุณสามารถใช้คำสั่งใดก็ได้ต่อไปนี้:
```
shining_list[["reviews"]]
shining_list$reviews
```
นอกจากนี้ คุณอาจจำเป็นที่จะต้องเลือกข้อมูลที่เก็บอยู่ในสมาชิกของ list อีกที ยกตัวอย่างเช่น คำสั่ง `shining_list[[2]][1]` จะทำการเลือกข้อมูลตัวแรก(`[1]`) ออกมาจาก vector actors ซึ่งเป็นข้อมูลตัวที่สองใน list (`shining_list[[2]]`) ถ้าลองพิมพ์คำสั่งนี้ลงไปใน Console คุณจะผลลัพธ์เป็น Jack Nicholson
`@instructions`
- เลือก vector ที่เก็บข้อมูลรายชื่อนักแสดงจาก `shining_list` พร้อมแสดงค่า vector นั้น
- เลือกข้อมูลตัวที่ 2 จาก vector ของรายชื่อนักแสดงที่เลือกออกมาเมื่อกี้นี้ (ซึ่งก็คือชื่อของนักแสดงคนที่ 2) แสดงค่าออกมาด้วยเช่นกัน
`@hint`
- ในการเลือก vector ของรายชื่อนักแสดง คุณสามารถใช้คำสั่ง `$actors` กับ `shining_list` ได้
- คุณสามารถใช้คำสั่ง `shining_list$actors[3]` ในการเลือกข้อมูลตัวที่ 3 จาก vector ของรายชื่อนักแสดงได้ ทีนี้ถ้าต้องการเลือกข้อมูลตัวที่ 2 คุณจะต้องเปลี่ยนแปลงคำสั่งนี้อย่างไร?
`@pre_exercise_code`
```{r}
load(url("http://s3.amazonaws.com/assets.datacamp.com/course/intro_to_r/shining_list.RData"))
```
*** =sample_code
```{r}
# shining_list is already pre-loaded in the workspace
# Print out the vector representing the actors
# Print the second element of the vector representing the actors
```
*** =solution
```{r}
# shining_list is already pre-loaded in the workspace
# Print out the vector representing the actors
shining_list$actors
# Print the second element of the vector representing the actors
shining_list$actors[2]
```
`@sct`
```{r}
msg <- paste("อย่าลบหรือเปลี่ยนแปลงรายละเอียดของ", "`shining_list`", "ที่เราได้เตรียมไว้ให้คุณ!")
# อย่าลบหรือเปลี่ยนแปลงรายละเอียดของ `shining_list` ที่เราได้เตรียมไว้ให้คุณ!
output_msg_1 <- paste("คุณได้ทำการเลือกและแสดงค่า vector รายชื่อนักแสดงหรือยัง? คุณสามารถใช้คำสั่ง ", "`shining_list$actors`", "ในการเลือก vector ที่ต้องการจาก list ได้")
# คุณได้ทำการเลือกและแสดงค่า vector รายชื่อนักแสดงหรือยัง? คุณสามารถใช้คำสั่ง `shining_list$actors` ในการเลือก vector ที่ต้องการจาก list ได้
output_msg_2 <- paste("ในการเลือกข้อมูลตัวที่ 2 จาก vector รายชื่อนักแสดง คุณควรทำการเลือกเป็นขั้นๆไป โดยเริ่มจากการเลือก vector รายชื่อนักแสดงจาก list ก่อนด้วยคำสั่ง", "`shining_list$actors`", "จากนั้นจึงทำการเลือกข้อมูลตัวที่ 2 จาก vector ที่ได้มา โดยการเติม", "`[2]`", "ต่อท้ายด้านหลังคำสั่งอีกทีหนึ่ง")
# ในการเลือกข้อมูลตัวที่ 2 จาก vector รายชื่อนักแสดง คุณควรทำการเลือกเป็นขั้นๆไป โดยเริ่มจากการเลือก vector รายชื่อนักแสดงจาก list ก่อนด้วยคำสั่ง `shining_list$actors` จากนั้นจึงทำการเลือกข้อมูลตัวที่ 2 จาก vector ที่ได้มา โดยการเติม `[2]` ต่อท้ายด้านหลังคำสั่งอีกทีหนึ่ง
success_msg <- "เยี่ยม! การเลือกข้อมูลจาก list นั้นไม่ใช่เรื่องยากเลยใช่ไหม? เราไปดูแบบฝึกหัดต่อไปกันเลย"
# เยี่ยม! การเลือกข้อมูลจาก list นั้นไม่ใช่เรื่องยากเลยใช่ไหม? เราไปดูแบบฝึกหัดต่อไปกันเลย
test_object("shining_list", undefined_msg = msg, incorrect_msg = msg)
test_output_contains("shining_list$actors", incorrect_msg = output_msg_1)
test_output_contains("shining_list$actors[2]", incorrect_msg = output_msg_2)
success_msg(success_msg)
```
--- type:NormalExercise xp:100 skills:1 key:ca3f7b71504ff93940cf65889d406a58c5b0019c
## การเพิ่มข้อมูลใน List
ในที่สุดเราก็มาถึงแบบฝึกหัดสุดท้ายกันแล้ว! หลังจากที่คุณได้ list ของข้อมูลภาพยนตร์มาแล้ว คุณก็พบว่าคุณลืมใส่ข้อมูลปีที่ภาพยนตร์เข้าฉาย คุณจึงตัดสินใจที่จะเพิ่มข้อมูลนี้ลงไปใน list
ในการเพิ่มข้อมูลใหม่เข้าไปใน list นั้น คุณสามารถใช้ function [`c()`](http://www.rdocumentation.org/packages/base/functions/c) ที่คุณเคยใช้มาแล้วในการสร้าง vector:
```
ext_list <- c(my_list , my_val)
```
คำสั่งด้านบนจะนำข้อมูล `my_val` มาต่อท้าย list เดิม `my_list` และเก็บผลลัพธ์ไว้ในตัวแปรใหม่ `ext_list`
ถ้าคุณต้องการตั้งชื่อให้กับข้อมูลที่ใส่เพิ่มเข้ามาด้วย ก็เพียงแค่ใส่ชื่อให้มันเหมือนกับที่ได้ทำไปแล้วในแบบฝึกหัดก่อนๆ:
```
ext_list <- c(my_list, my_name = my_val)
```
`@instructions`
- เพิ่มข้อมูลปีที่เข้าฉาย ลงไปใน `shining_list` โดยให้มีค่าเท่ากับ 1980 และตั้งชื่อข้อมูลว่า `year` จากนั้นเก็บ list ใหม่ที่ได้ไว้ในตัวแปร `shining_list_full`
- สุดท้ายนี้ ลองดูโครงสร้างของตัวแปร `shining_list_full` ด้วย function [`str()`](http://www.rdocumentation.org/packages/utils/functions/str)
`@hint`
ลองดูตัวอย่างโค้ดนี้ มันอาจช่วยคุณได้:
```
shining_list <- c(shining_list, ...)
```
แต่คุณยังต้องแก้ไขโค้ดนี้อีกเล็กน้อย เพื่อให้ได้ list ใหม่ที่สมบูรณ์
`@pre_exercise_code`
```{r, eval = FALSE}
load(url("http://s3.amazonaws.com/assets.datacamp.com/course/intro_to_r/shining_list.RData"))
```
*** =sample_code
```{r}
# shining_list, the list containing movie name, actors and reviews, is pre-loaded in the workspace
# We forgot something; add the year to shining_list
shining_list_full <-
# Have a look at shining_list_full
```
*** =solution
```{r}
# shining_list, the list containing movie name, actors and reviews, is pre-loaded in the workspace
# Use c() to add a year to shining_list
shining_list_full <- c(shining_list, year = 1980)
# Have a look at shining_list_full
str(shining_list_full)
```
`@sct`
```{r}
msg <- paste("อย่าลบหรือเปลี่ยนแปลงรายละเอียดของ", "`shining_list`", "ที่เราได้เตรียมไว้ให้คุณ!")
# อย่าลบหรือเปลี่ยนแปลงรายละเอียดของ `shining_list` ที่เราได้เตรียมไว้ให้คุณ!
object_msg <- paste("คุณได้เพิ่มข้อมูล", "`year`", "ลงไปใน", "`shining_list`", "อย่างถูกต้องหรือยัง? ค่าที่ใส่ลงไปเท่ากับ 1980 หรือไม่? คุณสามารถทำได้โดยใช้คำสั่งนี้", "`c(shining_list, year = 1980)`")
# คุณได้เพิ่มข้อมูล `year` ลงไปใน `shining_list` อย่างถูกต้องหรือยัง? ค่าที่ใส่ลงไปเท่ากับ 1980 หรือไม่? คุณสามารถทำได้โดยใช้คำสั่งนี้ `c(shining_list, year = 1980)`
function_msg <- paste("อย่าลืมแสดงโครงสร้างของ", "`shining_list_full`", "ด้วย function", "`str()`")
# อย่าลืมแสดงโครงสร้างของ `shining_list_full` ด้วย function `str()`
success_msg <- "เยี่ยมมาก! นี่คือแบบฝึกหัดสุดท้ายของหัวข้อนี้ และเป็นแบบฝึกหัดสุดท้ายของคอร์สนี้ด้วย! ตอนนี้คุณก็ได้เรียนรู้พื้นฐานภาษา R ไปหมดแล้ว แต่การใช้ R เพื่อวิเคราะห์ข้อมูลนั้นยังมีอะไรให้คุณเรียนรู้เพิ่มเติมอีกมาก ลองดูบทเรียนอื่นๆจาก DataCamp ที่จะช่วยให้คุณเป็นผู้เชี่ยวชาญการวิเคราะห์ข้อมูล!"
# เยี่ยมมาก! นี่คือแบบฝึกหัดสุดท้ายของหัวข้อนี้ และเป็นแบบฝึกหัดสุดท้ายของคอร์สนี้ด้วย! ตอนนี้คุณก็ได้เรียนรู้พื้นฐานภาษา R ไปหมดแล้ว แต่การใช้ R เพื่อวิเคราะห์ข้อมูลนั้นยังมีอะไรให้คุณเรียนรู้เพิ่มเติมอีกมาก ลองดูบทเรียนอื่นๆจาก DataCamp ที่จะช่วยให้คุณเป็นผู้เชี่ยวชาญการวิเคราะห์ข้อมูล!
test_object("shining_list", undefined_msg = msg, incorrect_msg = msg)
test_object("shining_list_full", eq_condition = "equal", incorrect_msg = object_msg)
test_function("str", "object", incorrect_msg = function_msg)
success_msg(success_msg)
```