第 04 天
變數類型的判斷與轉換
R 語言針對變數類型的判斷除了使用 class() 函數直截了當告訴我們答案以外,也能夠使用一系列 is.類型名稱() 的函數回傳邏輯值,用 TRUE 或者 FALSE 回傳判斷的結果;而變數類型的轉換則是透過一系列 as.類型名稱() 的函數進行轉換。
變數類型的判斷
除了判斷日期與時間變數類型要使用的是 inherits() 函數,其他變數類型都可以使用 is.類型名稱()這樣形式的函數判斷。
| 函數 | 範例 |
|---|---|
is.numeric() |
is.numeric(7.7) |
is.integer() |
is.integer(7L) |
is.logical() |
is.logical(FALSE) |
is.character() |
is.character("Learn R the easy way") |
inherits(x, what = "Date") |
inherits(Sys.Date(), what = "Date") |
inherits(x, what = "POSIXct") |
inherits(Sys.time(), what = "POSIXct") |
判斷是否為數值
使用 is.numeric() 函數請 R 語言判斷這個變數是不是數值。
> is.numeric(8.7)
[1] TRUE
> is.numeric("8.7")
[1] FALSE
判斷是否為整數
使用 is.integer() 函數請 R 語言判斷這個變數是不是整數。
> is.integer(7L)
[1] TRUE
> is.integer(7)
[1] FALSE
判斷是否為邏輯值
使用 is.logical() 函數請 R 語言判斷這個變數是不是邏輯值。
> is.logical(FALSE)
[1] TRUE
> is.logical("FALSE")
[1] FALSE
判斷是否為文字
使用 is.character() 函數請 R 語言判斷這個變數是不是文字。
> is.character("TRUE")
[1] TRUE
> is.character(TRUE)
[1] FALSE
判斷是否為日期
使用 inherit(x, what = "Date") 函數請 R 語言判斷這個變數 x 是不是日期,Sys.Date() 是一個 Date 的類型,因此 inherit(Sys.Date(), what = "Date") 函數會回傳 TRUE;而 "1970-01-01" 是一個 Character 的類型,inherit("1970-01-01", what = "Date") 函數會回傳 FALSE。
> inherits(Sys.Date(), what = "Date") # Sys.Date() 是日期類型
[1] TRUE
> inherits("1970-01-01", what = "Date") # "1970-01-01" 是文字類型
[1] FALSE
判斷是否為時間
使用 inherit(x, what = "POSIXct") 函數請 R 語言判斷這個變數 x 是不是時間,Sys.time() 是一個 POSIXct 的類型,因此 inherit(Sys.time(), what = "POSIXct") 函數會回傳 TRUE;而 "1970-01-01 00:00:00" 是一個 Character 的類型,inherit("1970-01-01 00:00:00", what = "POSIXct") 函數會回傳 FALSE。
> inherits(Sys.time(), what = "POSIXct") # Sys.time() 是時間類型
[1] TRUE
> inherits("1970-01-01 00:00:00", what = "POSIXct") # "1970-01-01 00:00:00" 是文字類型
[1] FALSE
變數類型的轉換
使用 as.類型名稱() 這樣形式的函數進行轉換。
| 函數 | 範例 |
|---|---|
as.numeric() |
as.numeric(7L) |
as.integer() |
as.integer(7) |
as.logical() |
as.logical("TRUE") |
as.character() |
as.character(Sys.Date()) |
as.Date() |
as.Date("1970-01-01") |
as.POSIXct() |
as.POSIXct("1970-01-01 00:00:00", tz = "GMT") |
轉換成數值
使用 as.numeric() 函數轉換變數為數值類型,我們可以輸入整數、邏輯值、日期或時間讓 R 語言轉換成數值。
> as.numeric(7L)
[1] 7
> as.numeric(TRUE)
[1] 1
> as.numeric(FALSE)
[1] 0
> as.numeric(Sys.Date())
[1] 17223
> as.numeric(Sys.time())
[1] 1488088428
轉換成整數
使用 as.integer() 函數轉換變數為數值類型,我們可以輸入沒有小數位數的數值、邏輯值、日期或時間讓 R 語言轉換成整數。
> as.integer(7)
[1] 7
> as.integer(TRUE)
[1] 1
> as.integer(FALSE)
[1] 0
> as.integer(Sys.Date())
[1] 17223
> as.integer(Sys.time())
[1] 1488088344
轉換成邏輯值
使用 as.logical() 函數轉換變數為邏輯值類型,輸入數值或整數類型的 0 會轉換成為 FALSE,其他的數字則一律轉換為 TRUE。
> as.logical(0)
[1] FALSE
> as.logical(0L)
[1] FALSE
> as.logical(1L)
[1] TRUE
> as.logical(-1.3)
[1] TRUE
> as.logical(87)
[1] TRUE
輸入文字類型的 "TRUE"、"True" 或 "true" 則會轉換成為 TRUE,反之亦同。
> as.logical("TRUE")
[1] TRUE
> as.logical("True")
[1] TRUE
> as.logical("true")
[1] TRUE
> as.logical("FALSE")
[1] FALSE
> as.logical("False")
[1] FALSE
> as.logical("false")
[1] FALSE
轉換成文字
使用 as.character() 函數轉換變數為文字類型,我們可以輸入任意的變數類型讓 R 語言轉換成文字。
> as.character(8.7)
[1] "8.7"
> as.character(87L)
[1] "87"
> as.character(TRUE)
[1] "TRUE"
> as.character(Sys.Date())
[1] "2017-02-25"
> as.character(Sys.time())
[1] "2017-02-25 20:22:32"
轉換成日期
使用 as.Date() 函數轉換變數為日期類型,我們可以輸入文字讓 R 語言轉換成日期。as.Date() 函數預設可以識別 %Y-%m-%d 或 %Y/%m/%d 這兩種格式。
> as.Date("1970-01-01")
[1] "1970-01-01"
> as.Date("1970/01/01")
[1] "1970-01-01"
如果是其他的格式,必須要加入 format 參數告知日期被記錄的文字格式為何,函數才能順利轉換,例如文字不是預設的格式,而是將月與日的資訊寫在年份的前面,沒有以 format 參數指定就會轉換成錯誤的日期:
> as.Date("01-01-1970") # 轉換錯誤
[1] "0001-01-19"
> as.Date("01-01-1970", format = "%m-%d-%Y") # 轉換正確
[1] "1970-01-01"
> as.Date("01/01/70") # 不是預設格式,轉換失敗
Error in charToDate(x) :
character string is not in a standard unambiguous format
> as.Date("01/01/70", format = "%m/%d/%y") # 轉換正確
[1] "1970-01-01"
不同符號所代表的格式整理在下表:
| 符號 | 格式 | 範例 |
|---|---|---|
| %d | 日 | 01 |
| %a | 禮拜幾的縮寫 | Mon |
| %A | 禮拜幾 | Monday |
| %m | 月 | 01 |
| %b | 月名稱的縮寫 | Jan |
| %B | 月名稱 | January |
| %y | 兩位數的年 | 70 |
| %Y | 四位數的年 | 1970 |
轉換成時間
使用 as.POSIXct() 函數轉換變數為時間類型,我們可以輸入文字讓 R 語言轉換成時間。如果沒有指定參數 tz =會預設使用電腦的時區。
> as.POSIXct("1970-01-01 00:00:00")
[1] "1970-01-01 08:00:00 CST"
> as.POSIXct("1970-01-01 00:00:00", tz = "GMT")
[1] "1970-01-01 GMT"
小結
第四天我們學會了如何判斷 R 語言的基本變數類型以及如何在變數類型之間進行轉換。
練習題
1. 1999 年 9 月 21 日 1 時 47 分 16 秒發生震央位於南投縣集集鎮,芮氏規模 7.3 的地震,請以文字記錄這個時間,並將它指派給 major_quake_time
major_quake_time <- "___"
2. 1999 年 9 月 21 日 1 時 57 分 15 秒發生第一個芮氏規模超過 6 的餘震,請以文字記錄這個時間,並將它指派給 first_aftershock_time
first_aftershock_time <- "___"
3. 請將前兩題的生成的變數轉換為時間類型,計算間隔多久發生第一個芮氏規模超過 6 的餘震
major_quake_time <- as.POSIXct(___)
first_aftershock_time <- as.POSIXct(___)
___ - ___