-
Notifications
You must be signed in to change notification settings - Fork 19
/
RL1_1.Rmd
340 lines (272 loc) · 10.5 KB
/
RL1_1.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
---
title: "基本資料類型"
author: "Yao-Jen Kuo"
date: "July, 2016"
output:
slidy_presentation:
fig_width: 8
fig_height: 5
---
## 基本資料類型
* 我們今天會介紹 R 語言的基本資料類型:
* Vector (向量)
* Factor (因素向量)
* Matrix (矩陣)
* Data Frame (資料框)
* List (清單)
## Vector
* Vector 可以包含數字、文字或二元邏輯資料
* 如果包含不同類型的資料,會記錄成文字
* 在 R 中我們可以使用 `=` 來指派變數,也可以使用 `<-`
* R 的使用者很廣泛使用 `<-`,可能不希望使用者把 `=` , `==` 弄混
* `<-` 可以使用 alt + 減號這組快速鍵輸入
* 我們先介紹使用 `c()` 來建造Vector,顧名思義是合併 (Combine)
```{r}
# 宣告一些測試的vectors
# 輸入`?functionName`可以看函數的說明
?c#查看一下c這個函數
numericVector <- c(1, 2, 5, 3, 6, -2, 4)#數字Vector
characterVector <- c("one", "two", "three")#文字Vector
logicalVector <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)#二元邏輯Vector
mixedVector <- c(1, "two", TRUE)#包含不同類型的資料就會被存成文字Vector
anotherVector <- c(1, 2, 3, TRUE, FALSE)#猜猜看?
# 使用class檢查vectors的類型
?class#查看一下class這個函數
class(numericVector)#檢查numericVector類型
class(characterVector)#檢查characterVector類型
class(logicalVector)#檢查logicalVector類型
class(mixedVector)#檢查mixedVector的類型
class(anotherVector)#檢查anotherVector的類型
```
## Vector (2)
* Vector 中的元素稱為 Scalar
* 在 R 語言中我們使用中括號 `[]` 將指定元素選擇出來
* 中括號 `[]` 裡頭要放所謂的索引值 (index)
* 索引值由 **1** 開始,這一點不同於一些其他程式語言是從 0 開始
* 實務中因為向量的長度可能是不固定的,所以我們很常使用 `length()` 來取得向量中最後一個元素的索引值
```{r}
# 看一下numericVector長什麼樣子
numericVector#把numericVector印出來
# 用`[]`把指定元素選擇出來
numericVector[1]#取出numericVector的第一個元素1
numericVector[c(2, 3, 4)]#取出numericVector的第二、三與四個元素2、5、3
numericVector[2:4]#取出numericVector的第二、三與四個元素2、5、3
numericVector[-1]#取出除了第一個元素以外的其他元素
# 使用`length`函數取得最後一個元素的索引值
?length#查看一下length這個函數
lengthNumVector <- length(numericVector)#指派numericVector的長度給lengthNumVector
lengthNumVector#印出來看
numericVector[2:lengthNumVector]#取出第二個到最後一個元素
```
## Vector (3)
* 除了用 `c()`,R 語言還有一些比較進階的函數例如 `seq()` 與 `rep()` 可以幫你輕鬆產出Vector
* `seq()` 是sequence,`rep()` 是replicate
* 顧名思義,`seq()` 是產出等差的 vector,`rep()` 是產出包含相同元素的vector
```{r}
# 練習使用`seq`
?seq#查看一下seq這個函數
seq(from=12, to=90, by=3)#產生一個從12開始到90,等差為3的vector
seq(from=100, to=1000, length=10)#產生一個從100開始到1000,元素個數為10的Vector
# 練習使用`rep`
?rep#查看一下rep這個函數
rep(9, times = 5)#產生一個有5個9的Vector
```
## Vector (4)
* Vector的應用
```{r}
#把mtcars的欄位名印出來
mtcars#R 語言內建的的資料,印出來看看
?str#查看一下str這個函數
str(mtcars)#看一下mtcars的結構
?names#查看一下names這個函數
colNames <- names(mtcars)#把mtcars的欄位名抓出來
colNames#印出來看看
colNames[1]#第一個元素
lengthColNames <- length(colNames)#總共有幾個欄位
lengthColNames#印出來看看, mtcars有11個欄位,跟我們在str的輸出看到是一樣的
#我想要一次印一個欄位名稱出來
colNames[1]#第一個元素
colNames[2]
colNames[3]
colNames[4]
colNames[5]
colNames[6]
colNames[7]
colNames[8]
colNames[9]
colNames[10]
colNames[lengthColNames]#這樣會很累
#可以寫成1:11,但是每換一個資料,就要重新修改程式
for (i in 1:lengthColNames){
print(colNames[i])#第i個元素
}
#試試看把iris的欄位名稱印出來
```
## Factor
* 你可以把 Factor 視作多了一些資訊的 Vector
* R 語言預設讀入資料會將非連續型變數以 Factor 的格式儲存
* 可以把它想成是字串向量,但是多了 `levels` 的資訊
* `levels` 的資訊有點像是相異值的概念
* 有兩種類型的 Factor,分別是名目型 (Nominal) 與順序型 (Ordinal)
* 名目型的 Factor 是沒有順序之分
```{r}
# 目前還是跟前面是一樣的Vector
gender <- c("Female", "Male", "Male", "Female", "Female")#建立一個3女2男的Vector
gender#印出來看看
str(gender)#看gender的結構
?summary#查看一下summary這個函數
summary(gender)#看gender的摘要
class(gender)#看gender的類型
# 轉換成名目型的Factor
?factor#查看一下factor這個函數
genderFactor <- factor(gender)
genderFactor#印出來看看
str(genderFactor)#看genderFactor的結構
summary(genderFactor)#看genderFactor的摘要
class(genderFactor)#看genderFactor的類型
# 檢查是否有順序之分
genderFactor[1]#這是女性Female
genderFactor[2]#這是男性Male
genderFactor[1] > genderFactor[2]#女性是否比男性優秀
```
## Factor (2)
* 相對順序型的 Factor 就有順序之分
* 但是必須要在轉換為 `factor` 函數中多增加 2 個參數,一個是 `ordered = TRUE`,另一個是 `levels`
* 我們用速度 (speed) 與溫度 (temperature) 做 2 次練習
```{r}
# 速度有快慢之分
speed <- c("Slow", "Fast", "Insane", "Slow")#宣告一個文字Vector
speedFactor <- factor(speed, ordered = TRUE, levels=c("Slow", "Fast", "Insane"))#轉換為Factor的時候要多加入2個參數
speedFactor#印出來看看
str(speedFactor)#看speedFactor的結構
summary(speedFactor)#看speedFactor的摘要
class(speedFactor)#看speedFactor的類型
```
## Factor (3)
```{r}
# 溫度有高低之分
temperature <- c("Cold", "Warm", "Hot", "Cold", "Hot")#宣告一個文字Vector
temperatureFactor <- factor(temperature, ordered = TRUE, levels=c("Cold", "Warm", "Hot"))#轉換為Factor的時候要多加入2個參數
temperatureFactor#印出來看看
str(temperatureFactor)#看temperatureFactor的結構
summary(temperatureFactor)#看temperatureFactor的摘要
class(temperatureFactor)#看temperatureFactor的類型
```
## Matrix
* 一個 m*n 的 matrix 指的是有 m 列、n 欄
```{r}
vector <- c(1:12)#這裡也可以使用seq(1:12)
?matrix
matrix <- matrix(vector, nrow = 4, ncol = 3, byrow = TRUE)#預設byrow是FALSE
matrix#把matrix印出來看看
matrix <- matrix(vector, nrow = 4, ncol = 3)#byrow用預設
matrix#再把matrix印出來看看
```
## Matrix (2)
* 讓我們用(m, n)的概念把matrix中的元素取出來
```{r}
matrix[1, ]#取出matrix中的第一列
matrix[, 2]#取出matrix中的第二欄
matrix[3, 3]#取出matrix中位於第三列第三欄的元素
```
## Matrix (3)
* Matrix 的應用 - 灰階圖片處理
* 圖片是天生的 Matrix
* 在灰階圖片中,每個像素儲存亮度
* 在彩色圖片中,每個像素儲存紅、綠、藍的強度
* 為了簡化問題,我們使用Netpbm grayscale格式的圖片(.pgm)
```{r}
#install.packages("pixmap")這個範例需要使用pixmap套件
library(pixmap)
onePiece <- read.pnm("/Users/tkuo/ntu_train/NTUTrainRL1/image/onePiece.pgm")#把圖片指派給onePiece這個物件, read.pnm是pixmap中的函數
onePiece#看看onePiece物件
?plot#查看一下plot函數
plot(onePiece)#把onePiece物件畫出來看看
str(onePiece)#檢查onePiece物件的結構
onePiece@grey[300, 600]#看一下(300, 600)這個像素的亮度
locator()#這是R的內建函式,可以找到圖片坐標,點完兩個點後按ESC離開
noUsopp <- onePiece#建立一個將會沒有騙人布的圖
noUsopp@grey[71.64799:325.1334, 215.1314:300.81890] <- 1#1是白色, 把第二個坐標寫在前面,trial & error
plot(noUsopp)#看看結果
```
## Data Frame
* Data Frame 是非常重要的資料結構,如果你是 SAS/SPSS/Stata的使用者,你可以想成是 Dataset。
* 一個 Data Frame 中可以包含不同資料類別的欄位
* 在下一個章節中我們會針對 Data Frame 做資料的整理
```{r}
mtcars#印出來看
View(mtcars)#用RStudio看
str(mtcars)#觀察結構
```
## Data Frame (2)
* 同樣可以用`[]`把Data Frame中的元素取出來
```{r}
mtcars[, 1:2]#把mtcars第一與第二欄取出來
mtcars[, "mpg"]#把mtcars中的mpg變數取出來
mtcars[, c("mpg", "cyl")]#把mtcars第一與第二欄取出來
mtcars$cyl[1]#把mtcars第二欄的第一筆資料取出來
summary(mtcars$mpg)#把mpg變數的描述性統計印出來
```
## Data Frame (3)
* 省略每次都要打資料集名稱的2種方法
使用Attach, Detach
```{r}
attach(mtcars)
summary(mpg)
detach(mtcars)
```
或使用with
```{r}
with(mtcars,{
summary(mpg)
})
```
## Data Frame (4)
* 整理一些好用的 Data Frame函數
```{r}
length(mtcars)#mtcars有多少個欄位
?dim#查看dim函數
dim(mtcars)#mtcars有幾列幾欄as in dimension
str(mtcars)#as in structure檢視mtcars的結構
class(mtcars)#檢視mtcars的類別
?head#查看head函數
head(mtcars)#檢視mtcars的前六列
tail(mtcars, n = 8)#檢視mtcars的後八列
names(mtcars)[9]#檢視mtcars的第九個欄位名稱
```
## Lists
* Lists 可以包含 Vectors, Matrice 與 Data Frame
```{r}
# 宣告要放入List的物件
myVector <- c(25, 26, 18, 39)
myMatrix <- matrix(1:10, nrow=5)
myDf <- head(mtcars, n=10)
# 沒有名稱的List
?list
myList <- list(myVector, myMatrix, myDf)#建立myList
myList#把mylist印出來看看
# 有名稱的List
myList <- list(vec = myVector, mat = myMatrix, df = myDf)#這次加上名稱
myList#再把mylist印出來看看
myList[2]#第二個物件:矩陣,包含名稱
myList[[2]]#第二個物件:矩陣,不含名稱
myList["mat"]#第二個物件:矩陣,包含名稱
myList[["mat"]]#第二個物件:矩陣,不含名稱
myList[[3]][4,2]#第三個物件myDf的第四列第二欄元素
```
## NA 與 NULL
* 在 R 中 NA 與 NULL 都是代表遺漏值,兩者最大的差異處在於是否會被運算函數包含做運算
* NA 會被包含,因此在運算函數中要另外使用`na.rm`這個參數
* NULL 不會被包含
```{r}
naExample <- c(88, NA, 12, 92, 33)#建立一個有NA的數字向量
nullExample <- c(88, NULL, 12, 92, 33)#建立一個有NULL的數字向量
?mean#查看mean函數
mean(naExample)#無法計算平均值
mean(naExample, na.rm=TRUE)#na.rm即為NA removoe
mean(nullExample)#可以順利計算平均值
```
## Reference
* R in Action, Robert I. Kabacoff
* The Art of R Programming, Norman Matloff
© Tony Yao-Jen Kuo 2016