R語言程式設計導論

林嶔 (Lin, Chin)

Lesson 1 R語言基本介紹及環境安裝

為什麼是R語言?

  1. R有非常先進的數據視覺化系統

  2. R有很多進階數據分析工具

  3. R是完整的資料科學解決方案

– 與其他統計軟體相比,R語言更接近程式語言,因此在熟悉以後更能建立自己的常規工作pipeline,加快自己的工作效率。

– 與其他程式語言相比,R語言更專注在統計分析功能的開發上,因此相關的功能較完善,比較容易找到合適的函數進行運算。

– R語言是生物資訊、統計分析、資料科學領域上的強勢語言,這些都是醫學院的學生未來比較有可能涉獵的領域。

– 截止至2021年4月,R 在TIOBE Index排名第16位。

開始的第一步:安裝R語言(1)

– 以Download R for Windows為例。

F01

– 選base

F02

– 選Download R 4.0.4 for Windows,如要下載先前版本選Previous releases

F03

– 程式安裝位置盡量選擇D槽

開始的第一步:安裝R語言(2)

– 選Free的版本

F04

– 選Download RStudio Desktop

F05

– 網頁往下滑會有其他版本可選擇

F06

開始的第一步:安裝R語言(3)

– 介面概況

F07

– 可以調整介面字體大小,Tools → Global Options → Appearance → Zoom or Editor font size

F08

– 建立一個Project : New Directory → New Project → 輸入Directory name → 選擇儲存位置 → Create Project

F09

F10

F11

第一節:與電腦交談(1)

– 因此,使用R的第一步,請先將他當作一個高級的計算機。

– 請試著在左邊的Console視窗中,輸入下列程式碼,並體會他的計算功能

# 四則運算
123 + 489
145 * 12

# 括弧優先規則
(1 + 2) * 3

# 指數運算
12^4

第一節:與電腦交談(2)

– 『函數』的使用方式是打下特定的字句,並且在『小括號』內輸入參數作為「input」,接著電腦將會根據你的指令進行回答。

  1. 函數「exp()」:負責進行自然指數運算

  2. 函數「sqrt()」:負責進行平方根運算

  3. 函數「log()」:負責(自然)對數運算

exp(2)
sqrt(10)
log(3)

– 有趣的是,『函數』中的『input』不見得只能有1個,如函數「log()」可以額外輸入對數的底數,並以『,』進行分隔:

log(3, base = 3)
log(4, base = 2)

– 需要注意的是,如果我們不告訴電腦哪個是底數,哪個是運算目標,哪個是底數,那他將會依序認為你輸入的第一個數為需要被運算的數,而第二個數為底數:

log(9, 3)
log(8, 2)

第一節:與電腦交談(3)

– 註:物件的屬性有很多種,我們第二節才會對他進行詳細的介紹

– 注意,等號的右邊為「input」,等號的左邊為「output」

x = 2 * 2 * 3
print(x)

– 如果你只是需要查看物件內容,事實上直接輸入物件名稱也可以達到相同效果

x

– 物件強大的地方在於,我們可以將其做為暫存的工具,並且可以直接對「x」物件進行運算

x/4

第一節:與電腦交談(4)

– 函數「c()」中間以逗點為界,此函數可以將不同「數字」合併在同一個物件內

x = c(1, 2, 3, 4, 5)
x
x^3
x = c(1, 2, 3, 4, 5)
y = c(6, 7, 9, 8, 10)
y - x
x * y

練習1:熟悉物件間的運算

– 問題1:請試著利用物件,列出1至10的平方根與3次方結果

– 問題2:請試著告訴我「%%」這個運算符號的意義(利用物件功能大量運算將有助於你總結規律得到答案)

練習1答案

x = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
x = 1:10 #也可以用這樣

sqrt(x) #也可以用"x^(-1/2)"
##  [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427
##  [9] 3.000000 3.162278
x^3
##  [1]    1    8   27   64  125  216  343  512  729 1000
x = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

x %% 3
##  [1] 1 2 0 1 2 0 1 2 0 1
x %% 4
##  [1] 1 2 3 0 1 2 3 0 1 2

第二節:物件索引(1)

y = c(6, 7, 9, 8, 10)
y[1]
y[c(3, 5)]
y[6]
y = c(6, 7, 9, 8, 10)
y[-1]
y[-c(3, 5)]

第二節:物件索引(2)

y[7] = 3 * 5
y
y[3] = -1
y
y[3] = y[1] + y[2]
y[6] = y[4] * y[5]
y

練習2:運算及變數索引功能

– 註,每個人的X不一樣(以下範例數字為3的範例),由老師指定

## [1]   1   3   4  12  16 192 208

練習2答案

y = c(1, 3)
y[3] = y[1] + y[2]
y[4] = y[2] * y[3]
y[5] = y[3] + y[4]
y[6] = y[4] * y[5]
y[7] = y[5] + y[6]
y
## [1]   1   3   4  12  16 192 208
y = c(1, 3)

i = 1
y[i+2] = y[i] + y[i+1]
i = 2
y[i+2] = y[i] * y[i+1]
i = 3
y[i+2] = y[i] + y[i+1]
i = 4
y[i+2] = y[i] * y[i+1]
i = 5
y[i+2] = y[i] + y[i+1]

y
## [1]   1   3   4  12  16 192 208

第三節:熟悉R裡面的基本物件(1)

  1. 變數(Variable)層:邏輯(logical)向量、整數(integer)向量、因子(factor)向量、數字(numeric)向量、文字(character)向量

  2. 陣列(Array)層:矩陣(matrix)、資料表(data.frame)

  3. 列表(List)層:列表(list)、S3物件(S3 class)、S4物件(S4 class)

第三節:熟悉R裡面的基本物件(2)

– 函數「as.XXX()」:可以強迫某個向量內所有的內容全部轉換為該種類

– 函數「class()」:可以查詢該物件的屬性

a = c(TRUE, FALSE, TRUE, FALSE)
class(a)

b = c(1, 2, 3, 4, 5)
class(b)
b1 = as.integer(b)
class(b1)

c = c(0.7, -0.9, 1.2, -2.1, 3.7)
c1 = as.integer(c)
c1

d = c("A", "B", "C", "C", "B")
class(d)
d1 = as.factor(d)
d1

e = c(c, d)
e
class(e)

e1 = c(c1, d1)
e1
class(e1)

第三節:熟悉R裡面的基本物件(3)

  1. 函數「length()」可以查詢該向量的長度

  2. 函數「levels()」可以查詢因子向量的類別種類

d = c("A", "B", "C", "C", "B")
class(d)
d1 = as.factor(d)
d1

n = length(d1)
n

categories = levels(d1)
categories
categories = levels(d1)
n.categories = length(categories)
n.categories

# 用下列這串意思一樣
n.categories = length(levels(d1))
n.categories

練習3:函數組合與物件索引的威力

x = c(16, 6, 13, 1, 3, 4, 14, 11, 11, 10, 9, 4, 6, 3, 9, 4, 2, 14, 17, 13, 16, 9, 6, 16, 1, 1,
      9, 5, 8, 6, 14, 11, 13, 17, 3, 9, 20, 9, 11, 4, 17, 8, 3, 16, 8, 4, 8, 9, 20, 14, 14, 5,
      14, 6, 4, 6, 6, 13, 1, 9, 6, 14, 16, 9, 20, 16, 9, 13, 13, 4, 2, 5, 8, 14, 18, 16, 16, 4,
      18, 11, 18, 11, 10, 6, 5, 17, 9, 11, 13, 20, 8, 8, 16, 9, 13, 4, 3, 17, 16, 9, 6, 8, 3, 8,
      2, 20, 11, 14, 16, 8, 11, 13, 1, 4, 20, 16, 17, 3, 16, 5, 20, 20, 5, 4, 5, 16, 6, 11, 10,
      2, 17, 13, 18, 2, 13, 2, 9, 2, 9, 13, 16, 8, 5, 11, 6, 18, 9, 9, 5, 11, 1, 8, 5, 2, 9, 16,
      1, 3, 5, 6, 2, 1, 9, 16, 20, 6, 4, 6, 8, 3, 5, 13, 17, 6, 1, 6, 4, 9, 6, 6, 5, 5, 5, 17, 8,
      13)

– 問題:請試著告訴我…

  1. 這串數列有共幾「個」數字?

  2. 共有幾「種」數字在物件「x」內?

  3. 這個數列中缺少了1至20中的哪些數字?

練習3答案

length(x)
## [1] 186
length(levels(factor(x)))
## [1] 16
lvl.x = levels(factor(x)) # 首先先把所有的數字種類找到,但此時是文字格式
idx.x = as.integer(lvl.x) # 將文字改成索引值
y = 1:20                  # 建立一個全新的1至20完整向量
y[-idx.x]                 # 列出索引值「以外」的數字!
## [1]  7 12 15 19

小結

– 我們已經學到下列功能,這些功能對於往後的應用都相當重要:

  1. 計算功能
  2. 函數運算
  3. 物件運算
  4. 物件屬性
  5. 組合函數