第 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(___)
___ - ___