## 用R做簡單迴歸分析

data(anscombe)
plot(y1 ~ x1, data = anscombe)
lmfit <- lm(y1~x1, data=anscombe)
abline(lmfit, col="red") 

## 數學運算

# 數字相加
3 + 8
## [1] 11
# 數字相減
3 - 8
## [1] -5
# 數字相乘
5 * 5
## [1] 25
# 數字相除
11 / 2
## [1] 5.5
# 指數
2^10
## [1] 1024
# 取餘數
11%%2
## [1] 1

## 設定變數

a <- 3
a = 3

b <- 5
a + b
## [1] 8

## 基礎資料型態

# 數值型態
numer <- 17.8
# 字串型態
char <- "hello world"
# 布林邏輯
logic <- TRUE

# 使用class 檢查資料型態
class(numer)
## [1] "numeric"

## 不同型態資料做運算

card_length <- 3
class(card_length)
## [1] "numeric"
#card_width <- "5 inches"
card_width = 5
class(card_width)
## [1] "numeric"
card_length * card_width
## [1] 15

## 計算一本書的價錢

RRP <- 35.99
Exchange = 31.74
#rrp
NTD <- RRP * Exchange
NTD
## [1] 1142.323
weight1 <- 75
height1 <- 185

weight2 <- 72
height2 <- 160

height_vec <- c(180, 169, 173)
names_vec <-c("Brian", "Toby", "Sherry")
# 兩個向量進行數學運算
x <- c(1,2,3,7)
y <- c(2,3,5,1)

x+y 
## [1] 3 5 8 8
x*y
## [1]  2  6 15  7
x - y 
## [1] -1 -1 -2  6
x/y
## [1] 0.5000000 0.6666667 0.6000000 7.0000000
x + 3
## [1]  4  5  6 10
x + c(3)
## [1]  4  5  6 10
x + c(3,3,3,3)
## [1]  4  5  6 10
x + c(3,4)
## [1]  4  6  6 11
x + c(3,4,3,4)
## [1]  4  6  6 11
x <- 1:20
x
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
x <- seq(1,20)
x
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

## seq

?seq
## starting httpd help server ...
##  done
seq(1,20,2)
##  [1]  1  3  5  7  9 11 13 15 17 19
seq(1,3.5, by =0.5)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5
seq(1,10,length=2)
## [1]  1 10
# 透過sum 將向量資料作加總
x <- c(1,2,3,5,7)
sum(x)
## [1] 18
# 查詢該如何使用sum函式
?sum
help(sum)

x <- 1:100
sum(x)
## [1] 5050

## 指定名稱

height_vec = c(180, 169, 173)
names(height_vec)
## NULL
names(height_vec) <- c("Brian", "Toby", "Sherry")

names(height_vec)
## [1] "Brian"  "Toby"   "Sherry"
height_vec
##  Brian   Toby Sherry
##    180    169    173
names_vec <- c("Brian", "Toby", "Sherry")
names(height_vec) <- names_vec

## 判斷向量內容是否符合條件

height_vec > 175
##  Brian   Toby Sherry
##   TRUE  FALSE  FALSE
height_vec < 175
##  Brian   Toby Sherry
##  FALSE   TRUE   TRUE
height_vec >= 175
##  Brian   Toby Sherry
##   TRUE  FALSE  FALSE
height_vec <= 175
##  Brian   Toby Sherry
##  FALSE   TRUE   TRUE
height_vec == 180
##  Brian   Toby Sherry
##   TRUE  FALSE  FALSE
height_vec != 180
##  Brian   Toby Sherry
##  FALSE   TRUE   TRUE
height_vec[height_vec > 175]
## Brian
##   180
height_vec[2] #取得第二個人的身高
## Toby
##  169
height_vec[c(2,3)] # 取得二跟三
##   Toby Sherry
##    169    173
2:3
## [1] 2 3
height_vec[2:3] # 取得二跟三
##   Toby Sherry
##    169    173
# 使用& 取得交集
height_vec[height_vec < 180 & height_vec > 170 ]
## Sherry
##    173
# 使用 | 取得聯集
height_vec[height_vec >= 180 | height_vec < 170 ]
## Brian  Toby
##   180   169

## 使用向量計算BMI

height_vec <- c(180,169,173)
weight_vec <- c(73, 87, 43)
names_vec <- c('Brian', 'Toby', 'Sherry')

bmi_vec <- weight_vec / (height_vec / 100) ^ 2
names(bmi_vec) = names_vec

bmi_vec[bmi_vec < 18.5 | bmi_vec >= 24]
##     Toby   Sherry
## 30.46112 14.36734
rbind(bmi_vec, height_vec, weight_vec)
##                Brian      Toby    Sherry
## bmi_vec     22.53086  30.46112  14.36734
## height_vec 180.00000 169.00000 173.00000
## weight_vec  73.00000  87.00000  43.00000
cbind(bmi_vec, height_vec, weight_vec)
##         bmi_vec height_vec weight_vec
## Brian  22.53086        180         73
## Toby   30.46112        169         87
## Sherry 14.36734        173         43
?matrix
1:9
## [1] 1 2 3 4 5 6 7 8 9
matrix(1:9, nrow=3)
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
matrix(1:9, nrow=1)
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,]    1    2    3    4    5    6    7    8    9
matrix(1:9, nrow=3, byrow=TRUE)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
kevin <- c(85,73)
marry <- c(72,64)
jerry <- c(59,66)

mat <- matrix(c(kevin, marry, jerry), nrow=3, byrow= TRUE)

colnames(mat) <- c('first', 'second')
rownames(mat) <-  c('kevin', 'marry', 'jerry')

mat2 <- matrix(c(kevin, marry, jerry), nrow=3, byrow=TRUE,
dimnames=list(c('kevin', 'marry', 'jerry'),c('first', 'second')))

dim(mat2)
## [1] 3 2
nrow(mat2)
## [1] 3
ncol(mat2)
## [1] 2
mat2[      1 ,  ]
##  first second
##     85     73
mat2[        , 1 ]
## kevin marry jerry
##    85    72    59
mat2[  c(2,3),   ]
##       first second
## marry    72     64
## jerry    59     66
mat2[  2:3   ,   ]
##       first second
## marry    72     64
## jerry    59     66
mat2[  2:3   ,  1 ]
## marry jerry
##    72    59

## 新增列與行

mat3 <- rbind(mat2, c(78,63))
mat3
##       first second
## kevin    85     73
## marry    72     64
## jerry    59     66
##          78     63
rownames(mat3)
## [1] "kevin" "marry" "jerry" ""
rownames(mat3)[4] 
## [1] ""
rownames(mat3)[4]  <- 'sam'

mat4 <- cbind(mat2,c(82,77,70))
mat4
##       first second
## kevin    85     73 82
## marry    72     64 77
## jerry    59     66 70
colnames(mat4)
## [1] "first"  "second" ""
colnames(mat4)[3] = 'third'
mat4
##       first second third
## kevin    85     73    82
## marry    72     64    77
## jerry    59     66    70
mat2
##       first second
## kevin    85     73
## marry    72     64
## jerry    59     66
rowSums(mat2)
## kevin marry jerry
##   158   136   125
colSums(mat2)
##  first second
##    216    203

## 矩陣運算

#矩陣宣告
m1 <- matrix(1:4, byrow=TRUE, nrow=2)
m2 <- matrix(5:8, byrow=TRUE, nrow=2)

#矩陣運算
m1 + m2
##      [,1] [,2]
## [1,]    6    8
## [2,]   10   12
m1 - m2
##      [,1] [,2]
## [1,]   -4   -4
## [2,]   -4   -4
m1 * m2
##      [,1] [,2]
## [1,]    5   12
## [2,]   21   32
m1 / m2
##           [,1]      [,2]
## [1,] 0.2000000 0.3333333
## [2,] 0.4285714 0.5000000
m1 %*% m2
##      [,1] [,2]
## [1,]   19   22
## [2,]   43   50

## 使用矩陣計算考試成績

kevin <- c(85,73)
marry <- c(72,64)
jerry <- c(59,66)
mat <- matrix(c(kevin, marry, jerry), nrow=3, byrow= TRUE)
mat
##      [,1] [,2]
## [1,]   85   73
## [2,]   72   64
## [3,]   59   66
weighted_score <- mat[,1] * 0.4 + mat[,2] * 0.6

weighted_score2 <- mat %*% c(0.4,0.6)

## 建立Data Frame

# 建立 Vector
days <- c('mon','tue','wed','thu','fri')
temp <- c(22.2,21,23,24.3,25)
rain <- c(TRUE, TRUE, FALSE, FALSE, TRUE)
mat <- matrix(c(days, temp,rain), nrow=3)
# 使用 Vector 建立Data Frame
df <- data.frame(days,temp,rain)

df
##   days temp  rain
## 1  mon 22.2  TRUE
## 2  tue 21.0  TRUE
## 3  wed 23.0 FALSE
## 4  thu 24.3 FALSE
## 5  fri 25.0  TRUE
class(df)
## [1] "data.frame"
# 檢視資料形態
class(df)
## [1] "data.frame"
# 檢視架構
str(df)
## 'data.frame':    5 obs. of  3 variables:
##  $days: Factor w/ 5 levels "fri","mon","thu",..: 2 4 5 3 1 ##$ temp: num  22.2 21 23 24.3 25
##  $rain: logi TRUE TRUE FALSE FALSE TRUE # 檢視資料摘要 summary(df) ## days temp rain ## fri:1 Min. :21.0 Mode :logical ## mon:1 1st Qu.:22.2 FALSE:2 ## thu:1 Median :23.0 TRUE :3 ## tue:1 Mean :23.1 NA's :0 ## wed:1 3rd Qu.:24.3 ## Max. :25.0 ## 使用R 內建的資料集 #表列資料集 data() #使用資料集 data(iris) View(iris) #觀察讀取到的資料集型態 class(iris) ## [1] "data.frame" 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 ...
# 觀看資料集的前幾筆資料與後幾筆資料
head(iris)
##   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
head(iris, 10)
##    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
## 7           4.6         3.4          1.4         0.3  setosa
## 8           5.0         3.4          1.5         0.2  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 10          4.9         3.1          1.5         0.1  setosa
tail(iris)
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 145          6.7         3.3          5.7         2.5 virginica
## 146          6.7         3.0          5.2         2.3 virginica
## 147          6.3         2.5          5.0         1.9 virginica
## 148          6.5         3.0          5.2         2.0 virginica
## 149          6.2         3.4          5.4         2.3 virginica
## 150          5.9         3.0          5.1         1.8 virginica
tail(iris,3)
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 148          6.5         3.0          5.2         2.0 virginica
## 149          6.2         3.4          5.4         2.3 virginica
## 150          5.9         3.0          5.1         1.8 virginica
#取前三列資料
iris[1:3,]
##   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
#取前三列第一行的資料
iris[1:3,1]
## [1] 5.1 4.9 4.7
#也可以用欄位名稱取值
iris[1:3,"Sepal.Length"]
## [1] 5.1 4.9 4.7
#取前兩行資料
iris[,1:2]
##     Sepal.Length Sepal.Width
## 1            5.1         3.5
## 2            4.9         3.0
## 3            4.7         3.2
## 4            4.6         3.1
## 5            5.0         3.6
## 6            5.4         3.9
## 7            4.6         3.4
## 8            5.0         3.4
## 9            4.4         2.9
## 10           4.9         3.1
## 11           5.4         3.7
## 12           4.8         3.4
## 13           4.8         3.0
## 14           4.3         3.0
## 15           5.8         4.0
## 16           5.7         4.4
## 17           5.4         3.9
## 18           5.1         3.5
## 19           5.7         3.8
## 20           5.1         3.8
## 21           5.4         3.4
## 22           5.1         3.7
## 23           4.6         3.6
## 24           5.1         3.3
## 25           4.8         3.4
## 26           5.0         3.0
## 27           5.0         3.4
## 28           5.2         3.5
## 29           5.2         3.4
## 30           4.7         3.2
## 31           4.8         3.1
## 32           5.4         3.4
## 33           5.2         4.1
## 34           5.5         4.2
## 35           4.9         3.1
## 36           5.0         3.2
## 37           5.5         3.5
## 38           4.9         3.6
## 39           4.4         3.0
## 40           5.1         3.4
## 41           5.0         3.5
## 42           4.5         2.3
## 43           4.4         3.2
## 44           5.0         3.5
## 45           5.1         3.8
## 46           4.8         3.0
## 47           5.1         3.8
## 48           4.6         3.2
## 49           5.3         3.7
## 50           5.0         3.3
## 51           7.0         3.2
## 52           6.4         3.2
## 53           6.9         3.1
## 54           5.5         2.3
## 55           6.5         2.8
## 56           5.7         2.8
## 57           6.3         3.3
## 58           4.9         2.4
## 59           6.6         2.9
## 60           5.2         2.7
## 61           5.0         2.0
## 62           5.9         3.0
## 63           6.0         2.2
## 64           6.1         2.9
## 65           5.6         2.9
## 66           6.7         3.1
## 67           5.6         3.0
## 68           5.8         2.7
## 69           6.2         2.2
## 70           5.6         2.5
## 71           5.9         3.2
## 72           6.1         2.8
## 73           6.3         2.5
## 74           6.1         2.8
## 75           6.4         2.9
## 76           6.6         3.0
## 77           6.8         2.8
## 78           6.7         3.0
## 79           6.0         2.9
## 80           5.7         2.6
## 81           5.5         2.4
## 82           5.5         2.4
## 83           5.8         2.7
## 84           6.0         2.7
## 85           5.4         3.0
## 86           6.0         3.4
## 87           6.7         3.1
## 88           6.3         2.3
## 89           5.6         3.0
## 90           5.5         2.5
## 91           5.5         2.6
## 92           6.1         3.0
## 93           5.8         2.6
## 94           5.0         2.3
## 95           5.6         2.7
## 96           5.7         3.0
## 97           5.7         2.9
## 98           6.2         2.9
## 99           5.1         2.5
## 100          5.7         2.8
## 101          6.3         3.3
## 102          5.8         2.7
## 103          7.1         3.0
## 104          6.3         2.9
## 105          6.5         3.0
## 106          7.6         3.0
## 107          4.9         2.5
## 108          7.3         2.9
## 109          6.7         2.5
## 110          7.2         3.6
## 111          6.5         3.2
## 112          6.4         2.7
## 113          6.8         3.0
## 114          5.7         2.5
## 115          5.8         2.8
## 116          6.4         3.2
## 117          6.5         3.0
## 118          7.7         3.8
## 119          7.7         2.6
## 120          6.0         2.2
## 121          6.9         3.2
## 122          5.6         2.8
## 123          7.7         2.8
## 124          6.3         2.7
## 125          6.7         3.3
## 126          7.2         3.2
## 127          6.2         2.8
## 128          6.1         3.0
## 129          6.4         2.8
## 130          7.2         3.0
## 131          7.4         2.8
## 132          7.9         3.8
## 133          6.4         2.8
## 134          6.3         2.8
## 135          6.1         2.6
## 136          7.7         3.0
## 137          6.3         3.4
## 138          6.4         3.1
## 139          6.0         3.0
## 140          6.9         3.1
## 141          6.7         3.1
## 142          6.9         3.1
## 143          5.8         2.7
## 144          6.8         3.2
## 145          6.7         3.3
## 146          6.7         3.0
## 147          6.3         2.5
## 148          6.5         3.0
## 149          6.2         3.4
## 150          5.9         3.0
#取特定欄位向量值
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[1:3,][1:2, 1:2]$Sepal.Length
## [1] 5.1 4.9
#取前五筆包含length 及 width 的資料
five.Sepal.iris <- iris[1:5, c("Sepal.Length", "Sepal.Width")]

five.iris <- iris[1:5,]
five.iris$Sepal.Length ## [1] 5.1 4.9 4.7 4.6 5.0 five.iris$Sepal.Length >= 5
## [1]  TRUE FALSE FALSE FALSE  TRUE
five.iris[five.iris$Sepal.Length >= 5, ] ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species ## 1 5.1 3.5 1.4 0.2 setosa ## 5 5.0 3.6 1.4 0.2 setosa which(five.iris$Sepal.Length >= 5)
## [1] 1 5
five.iris[which(five.iris$Sepal.Length >= 5), ] ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species ## 1 5.1 3.5 1.4 0.2 setosa ## 5 5.0 3.6 1.4 0.2 setosa #可以用條件做篩選 setosa.data <- iris[iris$Species=="setosa",1:5]

#使用which 做資料篩選
which(iris$Species=="setosa") ## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ## [24] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ## [47] 47 48 49 50 ## 比較sort 與 order a <- c(1,5,2,7,4,6) sort(a) ## [1] 1 2 4 5 6 7 order(a) ## [1] 1 3 5 2 6 4 head(sort(iris$Sepal.Length, decreasing = TRUE))
## [1] 7.9 7.7 7.7 7.7 7.7 7.6
tail(tw2330[order(tw2330$Close),]) str(tw2330) tw2330$Date <- as.Date(tw2330$Date) plot(Close ~ Date, data = tw2330)  ## 階層 (Factor) Weather <- c("sunny","rainy", "cloudy", "rainy", "cloudy") str(Weather) ## chr [1:5] "sunny" "rainy" "cloudy" "rainy" "cloudy" weather_category <- factor(Weather) weather_category ## [1] sunny rainy cloudy rainy cloudy ## Levels: cloudy rainy sunny levels(weather_category) ## [1] "cloudy" "rainy" "sunny" names_vec = c('a','b', 'c') scores_vec = c(77,56,66) gender_vec = c(1,0,1) df = data.frame(names_vec, scores_vec, gender_vec) str(df) ## 'data.frame': 3 obs. of 3 variables: ##$ names_vec : Factor w/ 3 levels "a","b","c": 1 2 3
##  $scores_vec: num 77 56 66 ##$ gender_vec: num  1 0 1
summary(df)
##  names_vec   scores_vec      gender_vec
##  a:1       Min.   :56.00   Min.   :0.0000
##  b:1       1st Qu.:61.00   1st Qu.:0.5000
##  c:1       Median :66.00   Median :1.0000
##            Mean   :66.33   Mean   :0.6667
##            3rd Qu.:71.50   3rd Qu.:1.0000
##            Max.   :77.00   Max.   :1.0000
df$gender_vec <- as.factor(df$gender_vec)
str(df)
## 'data.frame':    3 obs. of  3 variables:
##  $names_vec : Factor w/ 3 levels "a","b","c": 1 2 3 ##$ scores_vec: num  77 56 66
##  $gender_vec: Factor w/ 2 levels "0","1": 2 1 2 summary(df) ## names_vec scores_vec gender_vec ## a:1 Min. :56.00 0:1 ## b:1 1st Qu.:61.00 1:2 ## c:1 Median :66.00 ## Mean :66.33 ## 3rd Qu.:71.50 ## Max. :77.00 temperature <- c("Low", "High", "High", "Medium", "Low", "Medium") temperature_category <- factor(temperature, order = TRUE, levels = c("Low", "Medium", "High")) temperature_category ## [1] Low High High Medium Low Medium ## Levels: Low < Medium < High temperature_category[3] > temperature_category[1] ## [1] TRUE temperature_category[4] > temperature_category[3] ## [1] FALSE levels(temperature_category) ## [1] "Low" "Medium" "High" ## Lists item <- list(thing="hat", size=8.25) item ##$thing
## [1] "hat"
##
## $size ## [1] 8.25 item$thing
## [1] "hat"
item$size * 3  ## [1] 24.75 test <- list(name="Toby", score = c(87,57,72)) test$score
## [1] 87 57 72
test\$score[2]
## [1] 57
#沒有名字的清單

li <- list(c(1,2,3), c(2,3,4,5))
li
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [1] 2 3 4 5
li[[1]]
## [1] 1 2 3
li[[1]][2]
## [1] 2
li <- list(c(3,5,12), c(2,4,5,8,10))
li
## [[1]]
## [1]  3  5 12
##
## [[2]]
## [1]  2  4  5  8 10
#使用lapply將函式套用到list 上
lapply(li, sum)
## [[1]]
## [1] 20
##
## [[2]]
## [1] 29
lapply(li, mean)
## [[1]]
## [1] 6.666667
##
## [[2]]
## [1] 5.8
lapply(li, length)
## [[1]]
## [1] 3
##
## [[2]]
## [1] 5
# sapply = simplified lapply
sapply(li, length)
## [1] 3 5

## 流程控制(Flow Control)

x = 2
if(x > 3){
print('x>3');
}else{
print('x<=3');
}
## [1] "x<=3"
x = 3;
if(x > 3){
print("x > 3");
} else if(x < 4){
print("x < 4");
}else if(x ==3){
print("x == 3");
}else{
print("x < 3");
}
## [1] "x < 4"
for(i in 1:10){
print (i);
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
s = 0
for(i in 1:100){
s = s + i;
}
s
## [1] 5050
sum(1:100)
## [1] 5050
x <- c("sunny","rainy", "cloudy", "rainy", "cloudy")
1:length(x)
## [1] 1 2 3 4 5
for(i in 1:length(x)){
#print(i)
print(x[i])
}
## [1] "sunny"
## [1] "rainy"
## [1] "cloudy"
## [1] "rainy"
## [1] "cloudy"
seq_along(x)
## [1] 1 2 3 4 5
for(i in seq_along(x)){
#print(i)
print(x[i])
}
## [1] "sunny"
## [1] "rainy"
## [1] "cloudy"
## [1] "rainy"
## [1] "cloudy"
for (letter in x){
print(letter);
}
## [1] "sunny"
## [1] "rainy"
## [1] "cloudy"
## [1] "rainy"
## [1] "cloudy"

## 使用while 迴圈

s = 0;
cnt = 0;
while(cnt <= 100){
s = s + cnt;
cnt = cnt + 1;
}
s
## [1] 5050

## 範例: 產生多筆頁面連結

?paste

paste('hello', 'world')
## [1] "hello world"
paste('hello', 'world', sep = '')
## [1] "helloworld"
for (page in 1:20){
#print(page);
print(paste('http://www.appledaily.com.tw/realtimenews/section/new/', page, sep=''));
}
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/1"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/2"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/3"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/4"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/5"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/6"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/7"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/8"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/9"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/10"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/11"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/12"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/13"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/14"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/15"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/16"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/17"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/18"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/19"
## [1] "http://www.appledaily.com.tw/realtimenews/section/new/20"

# 函式 (Function)

addnum <- function(a, b){
a = a + 3
b = b * 2
a + b
}
addnum
## function(a, b){
##   a = a + 3
##   b = b * 2
##   a + b
## }
addnum(3,5)
## [1] 16
a = 3
b = 5
addnum(a,b)
## [1] 16
a
## [1] 3
b
## [1] 5
addnum <- function(a, b = 2){
a = a + 3
b = b * 2
a + b
}
addnum(3)
## [1] 10
addnum(a = 3)
## [1] 10
#addnum(b = 3)
addnum(b = 3, a = 2)
## [1] 11
f = function(a, b) {
a * 2
}
f(3)
## [1] 6
f = function(a, b) {
print(a+ b)
}
#f(3)

## 範例: 撰寫函式計算文章詞頻

a = 'sum returns the sum of all the values present in its arguments'

?strsplit
strsplit(a,split= ' ')
## [[1]]
##  [1] "sum"       "returns"   "the"       "sum"       "of"
##  [6] "all"       "the"       "values"    "present"   "in"
## [11] "its"       "arguments"
?table
b = c(1,2,2,1,2,1)
table(b)
## b
## 1 2
## 3 3
wordcount <- function(article){
article.split <- strsplit(article,split= ' ')
table(article.split)
}

wordcount(a)
## article.split
##       all arguments        in       its        of   present   returns
##         1         1         1         1         1         1         1
##       sum       the    values
##         2         2         1
xi = "President Barack Obama is embarking upon a final bout of delicate overseas diplomacy before his successor is elected in November, arriving in Asia Saturday for meetings with some of his most nettlesome counterparts.

Air Force One touched down in Hangzhou, the host city of this year's Group of 20 meetings, just after 2 p.m. local time (2 a.m. ET). Obama's first stop was a formal bilateral session with the summit's host, Chinese President Xi Jinping"

wordcount(xi)
## article.split
##                   (2                    2                   20
##                    1                    1                    1
##                    a                 a.m.                after
##                    2                    1                    1
##             arriving                 Asia               Barack
##                    1                    1                    1
##               before            bilateral                 bout
##                    1                    1                    1
##              Chinese                 city counterparts.\n\nAir
##                    1                    1                    1
##             delicate            diplomacy                 down
##                    1                    1                    1
##              elected            embarking                 ET).
##                    1                    1                    1
##                final                first                  for
##                    1                    1                    1
##                Force               formal                Group
##                    1                    1                    1
##            Hangzhou,                  his                 host
##                    1                    2                    1
##                host,                   in                   is
##                    1                    3                    2
##              Jinping                 just                local
##                    1                    1                    1
##             meetings            meetings,                 most
##                    1                    1                    1
##           nettlesome            November,                Obama
##                    1                    1                    1
##              Obama's                   of                  One
##                    1                    4                    1
##             overseas                 p.m.            President
##                    1                    1                    2
##             Saturday              session                 some
##                    1                    1                    1
##                 stop            successor             summit's
##                    1                    1                    1
##                  the                 this                 time
##                    2                    1                    1
##              touched                 upon                  was
##                    1                    1                    1
##                 with                   Xi               year's
##                    2                    1                    1