Ch06:查詢說明檔

# help.start()
# abs(1) # 輸入`ab`後 按下tab
# ?abs   # 等同於 help(abs)
# ??abs 
# vignette()
# vignette("Introduction", "Matrix")

筆記 - help.start: 說明檔首頁

Ch07:資料測量的尺度

判斷 Logical 產生自比較,或是使用T、TRUE、F或FALSE輸入

x <- 1 # 賦值
x < 2
## [1] TRUE
x <= 1
## [1] TRUE
z <- c("1" , "2" , "3")
z
## [1] "1" "2" "3"

字串 (Character)

輸入的時候利用“或’來包覆要輸入的文字 常用的Character處理函數

字串的剪接:paste

x <- "bubble"
y <- "bobble"
paste(x, y, sep=",")
## [1] "bubble,bobble"
paste(x, y, sep="")
## [1] "bubblebobble"
paste(x, y)   ##預設為空格
## [1] "bubble bobble"
paste(x, x , y , x , y , "123" ,  sep = ",")   ##全部接起來
## [1] "bubble,bubble,bobble,bubble,bobble,123"

不同連接符號

a <- paste("2015" , "12" , "14", sep  = "-")
b <- paste("13" , "15" , "00" , sep= "-")
a
## [1] "2015-12-14"
b
## [1] "13-15-00"
paste(a , b , sep ="~")
## [1] "2015-12-14~13-15-00"

字串的切割:strsplit

x <- "bubble"
strsplit(x, "b")
## [[1]]
## [1] ""   "u"  ""   "le"
time <- paste(a, b)
strsplit( time , " ")[[1]]
## [1] "2015-12-14" "13-15-00"
strsplit( time , " ")[[1]] ##取出日期
## [1] "2015-12-14" "13-15-00"
strsplit( time , " ")[[1]][1] ##取出日期
## [1] "2015-12-14"
strsplit( time , " ")[[1]][2] ##取出時間
## [1] "13-15-00"
date <- strsplit(time , " ")[[1]][1] 
strsplit(date , "," )[[1]][2] #取月份  
## [1] NA
  • 後面的中括號[[]]是代表list的第N個取值
  • 連續兩個[[]][[]]則代表第N個list的第n個list

截取子字串:substring

name1<-"郭雪芙"
substring(name1, 1, 1)  ##取出姓
## [1] "郭"
substring(time, 1, 10)  ##取出日期
## [1] "2015-12-14"
substring(time, 6, 7)  ##取出月份
## [1] "12"

計算字串長度:nchar

nchar(name1) # 試著與 length 函數比較
## [1] 3

小挑戰

  • 取出金城武的姓

  • 取出字串 a <- “2015-12-14” 的月份

name2 <- "金城武"
substring(name2 , 1 , 2)
## [1] "金城"
a <- "2015-12-14"
substring(a , 6, 7)
## [1] "12"

Factor (類別)

如何處理名目變數?

x <- c("F","M","F","F")
x
## [1] "F" "M" "F" "F"
x <- factor(c("F","M","F","F"), levels=c("F","M"))   ##level做成有順序之分(依照前後順序)
x
## [1] F M F F
## Levels: F M
x <- factor(c("F","M","F","F"), levels=c("F"))
levels(x)                   ##沒被分到類變成NA
## [1] "F"
x
## [1] F    <NA> F    F   
## Levels: F
as.integer(x)
## [1]  1 NA  1  1
x
## [1] F    <NA> F    F   
## Levels: F

類別變項處理

  • 進階應用
edu <- factor(c("小學" ,"國中" , "高中") ,levels= c("小學" ,"國中" , "高中"),
                                    labels= c("6" , "9" , "12"))   
edu
## [1] 6  9  12
## Levels: 6 9 12
edu1 <- as.character(edu)   ##factor轉字串
as.numeric(edu1)               ## 字串轉數字
## [1]  6  9 12

如何處理順序資料?

農業社會 男尊女卑

Argri <- factor(c("F","M","F","F"), order=TRUE, levels=c("F","M"))
Argri
## [1] F M F F
## Levels: F < M

阿美族 女尊男卑

Amis <- factor(c("F","M","F","F"), order=FALSE, levels=c("F","M"))
##應該要用
Amis <- factor(c("F","M","F","F"), order=TRUE, levels=c("M","F"))

舉一個認真的例子 - 班上一號到六號分別拿到A, B, C的級別

rank=factor(c("C","A","B","B","C","C"), order=TRUE, level=c("C","B","A"))
rank
## [1] C A B B C C
## Levels: C < B < A
rank[1] < rank[2]    ##order可以比大小
## [1] TRUE

Ch08: 資料型態的轉換

向量有同質性 Vector

  • Character > Numeric > Integer > Logical
x <- c(1, 2.0, "3")
x
## [1] "1" "2" "3"
c(104 , 73 , "82")  ##有文字無法運算
## [1] "104" "73"  "82"
mean(as.numeric(c(104 , 73 , "82")))#轉成數字就可以了
## [1] 86.33333

資料型態的轉換

利用以下函數自行轉換向量型態: as.character, as.numeric, as.logical。

as.numeric("2")
## [1] 2
x <- c(1, 2.0, "3")
as.numeric(x)
## [1] 1 2 3
y <- c("1", "2", "3", "2", "a")
as.numeric(y)   #NA代表Not available,代表著missing value
## Warning: 強制變更過程中產生了 NA
## [1]  1  2  3  2 NA

資料型態的轉換2

字串轉數字

a1 <- c("89", "91", "102")
as.numeric(a1)
## [1]  89  91 102

布林轉數字

a2 <- c(TRUE, TRUE, FALSE)
as.numeric(a2)
## [1] 1 1 0

數字轉布林

a3 <- c(-2, -1, 0, 1, 2) # 只有0會被轉成FALSE
as.logical(a3)
## [1]  TRUE  TRUE FALSE  TRUE  TRUE

數字轉字串

as.character(a3)
## [1] "-2" "-1" "0"  "1"  "2"
z <- c(1, 2, 3, 4, 3, 2, 1)
z
## [1] 1 2 3 4 3 2 1
as.character(z) # 字串
## [1] "1" "2" "3" "4" "3" "2" "1"
z1 <- factor(z) # 轉類別
as.numeric(z1)
## [1] 1 2 3 4 3 2 1
z1 <- as.character(z1)   ##類別要轉數字必須先轉成字串,再轉成數字
z1 <- as.numeric(z1)

Ch09: List 存放異質性資料的容器

List

TRUE [1] "林志玲" "174"    "52"     "TRUE"
TRUE [1] "林志玲"
TRUE List of 4
TRUE  $ : chr "林志玲"
TRUE  $ : num 174
TRUE  $ : num 52
TRUE  $ : logi TRUE

List 賦值/取值

x3 <- list(name=c("林志玲", "隋棠", "蔡依林"), 
           height=c(174, 173, 158),
           weight=c(52, 48, 39),
           model=c(TRUE, TRUE, FALSE))

x3[[1]]   #姓名
## [1] "林志玲" "隋棠"   "蔡依林"
x3[[2]]   #身高
## [1] 174 173 158
x3
## $name
## [1] "林志玲" "隋棠"   "蔡依林"
## 
## $height
## [1] 174 173 158
## 
## $weight
## [1] 52 48 39
## 
## $model
## [1]  TRUE  TRUE FALSE
x3$name               ##可以用別名
## [1] "林志玲" "隋棠"   "蔡依林"
x3[["name"]]          ##windows中文字有時候讀不到時改用這個
## [1] "林志玲" "隋棠"   "蔡依林"
x3[[names(x3)[1]]]
## [1] "林志玲" "隋棠"   "蔡依林"
x3[[1]]            #同上
## [1] "林志玲" "隋棠"   "蔡依林"
names(x3)
## [1] "name"   "height" "weight" "model"
names(x3) <- c("Name", "Height", "Weight", "Model")   ##重新命名

Ch10:DataFrame 資料表

資料表 data.frame

– 資料的整理 – 圖形的繪製 – 模型的配適與預測

世界上最常見的範例資料 iris

data("iris")
head(iris) # 列出前幾筆資料, 預設6筆
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
dim(iris)  # 列出資料表的 rows and columns
## [1] 150   5
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

格的取值 - 座標

類似於向量取值,在中括號 [i, j] 中進行取值 逗號的前後分別表示資料表的 row and column

iris[2, 3]
## [1] 1.4
iris[1:6, 1:3]
##   Sepal.Length Sepal.Width Petal.Length
## 1          5.1         3.5          1.4
## 2          4.9         3.0          1.4
## 3          4.7         3.2          1.3
## 4          4.6         3.1          1.5
## 5          5.0         3.6          1.4
## 6          5.4         3.9          1.7

表格的取值 - 列

欲選取第i筆觀察資料時,使用 [i, ] 在column欄位留白

iris[2, ]
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 2          4.9           3          1.4         0.2  setosa
iris[c(1, 51, 101),]
##     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1            5.1         3.5          1.4         0.2     setosa
## 51           7.0         3.2          4.7         1.4 versicolor
## 101          6.3         3.3          6.0         2.5  virginica

表格的取值 - 欄

欲選取整欄資料時,有三種常用方法

iris[,1] # 欄位名稱未知
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4
##  [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5
##  [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0
##  [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8
##  [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4
##  [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8
## [103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7
## [120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7
## [137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9
iris$Sepal.Length # 已知欄位名稱
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4
##  [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5
##  [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0
##  [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8
##  [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4
##  [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8
## [103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7
## [120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7
## [137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9
iris[["Sepal.Length"]] # 已知欄位名稱   三種取值都一樣
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4
##  [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5
##  [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0
##  [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8
##  [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4
##  [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8
## [103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7
## [120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7
## [137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9

表格的取值 - 篩選

利用條件式做篩選

iris[iris$Sepal.Length > 5.5 & iris$Species=="setosa", ]   ##多條件的篩選
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 15          5.8         4.0          1.2         0.2  setosa
## 16          5.7         4.4          1.5         0.4  setosa
## 19          5.7         3.8          1.7         0.3  setosa

Ch11: Pattern Matching and Replacement

關鍵字的取代與查找 gsub

  • gsub(pattern, replacement, x) 欲取代值/取代值/資料
year <- c("民國99", "民國100", "民國101")
gsub("民國", "", year)
## [1] "99"  "100" "101"
as.numeric(gsub("民國", "", year)) + 1911
## [1] 2010 2011 2012

關鍵字的取代與查找 - grep

grep(pattern, x, value=FALSE) grepl(pattern, x) grep(pattern, x, value=TRUE)

title <- c("馬習會前交涉祕辛曝光", "馬說明馬習會:公布逐字稿不可思議的透明", "談22K政策朱立倫:不幸被企業濫用")
grep("馬習會", title)
## [1] 1 2
grepl("馬習會", title)
## [1]  TRUE  TRUE FALSE
grep("馬習會", title, value = TRUE)   ##預設為FALSE,只會回報位置
## [1] "馬習會前交涉祕辛曝光"                  
## [2] "馬說明馬習會:公布逐字稿不可思議的透明"

關鍵字的取代與查找 - gregexpr

txt <- c("名模林志玲身高有174公分,體重52公斤", "女神蔡依林身高158公分,體重只有39公斤")
matches <- gregexpr("[0-9]+", txt)  #抓數字出來
matches  ##故訴我們位置/長度
## [[1]]
## [1]  9 17
## attr(,"match.length")
## [1] 3 2
## 
## [[2]]
## [1]  8 18
## attr(,"match.length")
## [1] 3 2
regmatches(txt, matches)
## [[1]]
## [1] "174" "52" 
## 
## [[2]]
## [1] "158" "39"

Recape

取代:gsub 查找位置:grep(value=FALSE), grep(value=TRUE), grepl 查找結果:grepexpr