
> 表示可以輸入指令1 + 1 後按下 Enter,檢查螢幕輸出1 + 後按下 Enter,檢查螢幕輸出 + 表示尚未輸入完成,應繼續輸入> 開頭)1 + 1 後按下 Control + Enter,檢查 命令列區1 + 後按下 Control + Enter,檢查 命令列區dat1 <- data.frame(date=c("11/29","11/30","12/01","12/02","12/03","12/04","12/05"),
weekday=c("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"))
dat1 # print R object
date weekday 1 11/29 Sun 2 11/30 Mon 3 12/01 Tue 4 12/02 Wed 5 12/03 Thu 6 12/04 Fri 7 12/05 Sat
dat1[1, 1] # 取值 dat1[, 1] dat1[1:2,]
dat2 <- data.frame(date=c("11/29","11/30","12/01","12/02","12/03","12/04","12/05"),
temp=c(17, 18, 24, 20, 21, 22, 24))
dat2 # print R object
date temp 1 11/29 17 2 11/30 18 3 12/01 24 4 12/02 20 5 12/03 21 6 12/04 22 7 12/05 24
dat2[, 2] dat2[, 2] * 2 dat2[, 2] + c(1, 0, -0.5, 2, 3, -2, 0.5)
dat2[dat2$temp<20,]
date temp 1 11/29 17 2 11/30 18
dat2[grepl("11", dat2$date), ]
date temp 1 11/29 17 2 11/30 18
cbind(dat1,temp=dat2$temp)[dat2$temp<20,]
date weekday temp 1 11/29 Sun 17 2 11/30 Mon 18
1
[1] 1
2
[1] 2
1; 2
[1] 1
[1] 2
+'apple' 或雙引號 "book" 所包覆的敘述當成字串# 基礎運算 1 + 2 + 3
[1] 6
1 + 2 + 3
[1] 6
x <- 10 y <- 4 (x + y) / 2 # 簡單的公式運算
[1] 7
+, -, *, /, …)<-) 表示賦值,把箭號右邊的結果指向到R物件# basic expression of integer vector c(1, 2, 3, 4)
[1] 1 2 3 4
# simple expression 1:4
[1] 1 2 3 4
4:1
[1] 4 3 2 1
c(...) 表示 (c 取自combine之意), 整個函數內容以 ()包括起來,元素以逗號分隔。: (冒號) 簡記,譬如數列 (1, 2, 3, 4) 在 R 語言中可利用 1:4 簡記4:1 的簡記方式來產生 (4, 3, 2, 1) 的向量seq(1, 4)
[1] 1 2 3 4
seq(1, 9, by = 2) # 間隔為2
[1] 1 3 5 7 9
seq(1, 9, length.out = 5) # 分割長度為5
[1] 1 3 5 7 9
seq函數生成有規則的數值向量(序列)seq() 函數中按 tab 鍵觀察有哪些參數可以使用by 表示數列間隔,預設為1length.out 表示數列長度seq 函數列出偶數數列: 2, 4, 6, 8, 10seq(1, 10, length.out=5) 的輸出結果
參考解答
1:10
[1] 1 2 3 4 5 6 7 8 9 10
seq(2, 10, by = 2)
[1] 2 4 6 8 10
seq(2, 10, length.out = 5)
[1] 2 4 6 8 10
seq(1, 10, length.out=5)
[1] 1.00 3.25 5.50 7.75 10.00
R的數列運算滿足 recycling properties
c(1, 2, 3) * c(2, 2, 2)
[1] 2 4 6
# shorter arguments are recycled 1:3 * 2
[1] 2 4 6
c(0.5, 1.5, 2.5, 3.5) * c(2, 1)
[1] 1.0 1.5 5.0 3.5
向量的四則運算,請計算以下五位女藝人的BMI
Hint: BMI = 體重 / (身高/100)^2
height <- c(174, 158, 160, 168, 173) weight <- c(52, 39, 42, 46, 48)
[ ] (中括號) 中輸入元素的位置進行取值-) 移除給定位置元素 (反向選取)x <- c(174, 158, 160, 168, 173) x[1] # 選取第1個位置的元素
[1] 174
x[c(1, 3)] # 選取第1, 3個位置的元素
[1] 174 160
x[c(2, 3, 1)] # 依序取值
[1] 158 160 174
# 在[ ]中使用負號 (-) 做反向選取 x[-1]
[1] 158 160 168 173
x[-c(1, 3, 4)]
[1] 158 173
給定條件進行取值
>, <, >=, <=, ==, !=)&, |)x > 160
[1] TRUE FALSE FALSE TRUE TRUE
# 使用比較運算子 加上 `which` 函數進行取值 index <- which(x > 160) index
[1] 1 4 5
x[index]
[1] 174 168 173
# 指令壓縮,將指令寫在 [ ] 中,以達到縮短程式碼的功效 x[which(x > 160)]
[1] 174 168 173
# 配合邏輯算子進行多條件的取值 x[which(x > 160 & x < 175)]
[1] 174 168 173
# 可以省略 which x[x > 160 & x < 175]
[1] 174 168 173
[ ] (中括號) 與 <- (箭號) 進行取代與新增元素x <- c(174, 158, 160, 168, 173) # 取代特定位置的元素 x[2] <- 158.5 # 取代x物件的第二個元素 x
[1] 174.0 158.5 160.0 168.0 173.0
x[c(1, 5)] <- 175 x
[1] 175.0 158.5 160.0 168.0 175.0
# 也可以用條件篩選做取代 x[x > 160] <- 170 # 取代大於160的值為170 x
[1] 170.0 158.5 160.0 170.0 170.0
[ ] (中括號) 與 <- (箭號) 進行新增元素NA 為系統保留字,表示Not Available / Missing Valuesx <- c(174, 158, 160, 168, 173) # 在 [ ] 中新增元素 x[6] <- 168 x
[1] 174 158 160 168 173 168
x[8] <- 147 x # 未指定的元素值預設為NA
[1] 174 158 160 168 173 168 NA 147
length(x) # 查看向量物件的長度
[1] 8
x[length(x) + 1] <- 166 # 接續增加新元素
各種自救措施
help.start()
ab # 輸入`ab`後 按下tab
?abs # 等同於 help(abs)
??abs
vignette()
vignette("Introduction", "Matrix")
ab開頭的函數| 資料衡量尺度 | R變數形態 | 特性 | 範例 |
|---|---|---|---|
| 連續資料 | numeric | 數值 | 身高 |
| 比例資料 | numeric | 比值 | 流失率 |
| 區間資料 | numeric | 大小距離 | 溫度 |
| 順序資料 | factor | 優先順序 | 名次 |
| 名目資料 | factor | 類別 | 國家 |
| 布林資料 | logical | 邏輯值 | 性別 |
| 文字資料 | character | 文字 | 電話號碼 |
產生自比較,或是使用T、TRUE、F或FALSE輸入
x <- 1 # 賦值 x < 2
[1] TRUE
x <= 1
[1] TRUE
"或'來包覆要輸入的文字字串的剪接:paste
x <- "bubble" y <- "bobble" paste(x, y, sep=",")
[1] "bubble,bobble"
字串的切割:strsplit
strsplit(x, "b")
[[1]] [1] "" "u" "" "le"
截取子字串:substring
name1<-"郭雪芙" substring(name1, 1, 1)
[1] "郭"
計算字串長度:nchar
nchar(name1) # 試著與 length 函數比較
[1] 3
a <- "2015-12-14" 的月份# 取出金城武的 name2<-"金城武" substring(name2, 1, 2)
[1] "金城"
# 取出字串 "2015-12-14" 的月份 a <- "2015-12-14" substring(a, 6, 7)
[1] "12"
tmp <- strsplit(a, "-") tmp[[1]][2]
[1] "12"
如何處理名目變數?
x <- c("F","M","F","F")
x
[1] "F" "M" "F" "F"
x <- factor(c("F","M","F","F"), levels=c("F","M"))
x
[1] F M F F Levels: F M
x <- factor(c("F","M","F","F"), levels=c("F"))
levels(x)
[1] "F"
as.integer(x)
[1] 1 NA 1 1
#農業社會 男尊女卑
Argri <- factor(c("F","M","F","F"), order=TRUE, levels=c("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]
[1] TRUE
Character > Numeric > Integer > Logical
x <- c(1, 2.0, "3") x
[1] "1" "2" "3"
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)
Warning: 強制變更過程中產生了 NA
[1] 1 2 3 2 NA
NA代表Not available,代表著missing value# 字串轉數字
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, 2, 3, 2, 1) as.character(z) # 字串
[1] "1" "2" "3" "2" "3" "2" "1"
factor(z) # 轉類別
[1] 1 2 3 2 3 2 1 Levels: 1 2 3
x1 <- c("林志玲", 174, 52, TRUE) # 所有元素都被轉換成字串
x1
[1] "林志玲" "174" "52" "TRUE"
x2 <- list("林志玲", 174, 52, TRUE) # 保留資料型態
str(x2)
List of 4 $ : chr "林志玲" $ : num 174 $ : num 52 $ : logi TRUE
x3 <- list(name=c("林志玲", "隋棠", "蔡依林"),
height=c(174, 173, 158),
weight=c(52, 48, 39),
model=c(TRUE, TRUE, FALSE))
x3[[1]]
[1] "林志玲" "隋棠" "蔡依林"
x3$name
[1] "林志玲" "隋棠" "蔡依林"
x3[["name"]]
[1] "林志玲" "隋棠" "蔡依林"
names(x3)
[1] "name" "height" "weight" "model"
# names(x3) <- c("Name", "Height", "Weight", "Model")
data.framedata.frame 是資料分析時最基本的物件R 提供將外部資料轉成 data.frame 的功能data.frame 可以進行以下功能:
irisdata("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
[i, j] 中進行取值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] # 欄位名稱未知 iris$Sepal.Length # 已知欄位名稱 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
gsubgsub(pattern, replacement, x)
year <- c("民國99", "民國100", "民國101")
gsub("民國", "", year)
[1] "99" "100" "101"
as.numeric(gsub("民國", "", year)) + 1911
[1] 2010 2011 2012
grepgrep(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)
[1] "馬習會前交涉祕辛曝光" [2] "馬說明馬習會:公布逐字稿不可思議的透明"
gregexprtxt <- c("名模林志玲身高有174公分,體重52公斤", "女神蔡依林身高158公分,體重只有39公斤")
matches <- gregexpr("[0-9]+", txt)
regmatches(txt, matches)
[[1]] [1] "174" "52" [[2]] [1] "158" "39"
gsubgrep(value=FALSE), grep(value=TRUE), greplgrepexpr