lecture
website icon
資料類型
×
website icon 資料管理 統計分析 相關資源 巨人肩膀 語法索引 關於作者

簡介

本部分介紹各種不同的資料類型,使用到的函數包含:

這裡介紹 R 的資料類型,不同的資料類型,會影響 R 儲存與分析資料的方式,瞭解資料類型是 R 統計分析的第一步。如同多數程式語言, R 的資料類型包含數值字串時間布林邏輯等。

數值

數值資料是最常見的資料類型,包含實數系數字和整數,例如:1, 10, 0.5, -5等我們常見的數字。如果沒有特別宣告而直接輸入任一數字, R 會將資料儲存為浮點數(Floating-point number),浮點數可以容許有小數點。如果想要儲存為整數,可以在數字後面加上一個 L , R 就會將數字儲存為整數。整數是沒有小數點的精確數值,好處是可以避免計算時小數點造成的誤差,也能節省電腦記憶體,提升程式的運算效率。

> x<-10
> y<-10L
> class(x) #回傳資料類型
[1] "numeric"
> class(y)
[1] "integer"

除了實數系之外, R 也可以輸入i虛數,表達複數系。

> x<-0+i
> class(x)
[1] "complex"
> x^2
[1] -1+0i

字串

在數字或文字的前後加上單引號或雙引號,資料類型就轉換為字串。值得注意的是,字串不能做數學運算,因此數字前後加上引號後,資料已經改變為字串類型,就失去了計算的功能。字串最常使用的功能是用來資料探勘,例如網路爬蟲就需要使用到字串的功能。

> str_1<-"It is R"
> str_2<-"Program"
> class(str_1)
[1] "character"
> paste(str_1, str_2) #字串串接
[1] "It is R Program"

邏輯

布林邏輯是用來判斷陳述真偽的一種資料類型。陳述為真的時候,回傳TURE;反之則回傳FALSE。

> x<-TRUE
> class(x)
[1] "logical"

時間

時間是一個非常重要的資料類型,值得多花一些時間說明。由於時間與數學的十進制有別,將資料轉換為標準的日期與時間, R 才可以正確讀取時間並計算時間差。

這裡介紹幾種常見用來處理時間的函數與方法,首先是取得時間。 Sys.Date() 、 date() 、 Sys.time() 、 Sys.timezone() 是 R 最常用來取得當下時間的四種函數。

> Sys.Date()
[1] "2026-07-20"
> date()
[1] "Mon Jul 20 16:28:09 2026"
> Sys.time()
[1] "2026-07-20 16:28:58 CST"
> Sys.timezone()
[1] "Asia/Taipei"

如果不是要擷取當下的時間,而是要自行宣告一個特定時間,則必須透過特定函數來完成。例如宣告日期使用的 as.Date() 函數。如果沒有進行時間宣告,而是直接輸入2026/07/20或2026-07-20, R 會誤判為數字直接進行除法或減法運算;加上雙引號將資料變成字串看似格式正確,但請記得字串無法進行運算。只有正確宣告時間才可以進行時間上的計算。

> x<-as.Date("2026/07/20")
[1] "2026-07-20"
> class(x)
[1] "Date"
> y<-as.Date("2025/07/20")
> x-y
Time difference of 365 days

宣告小時、分鐘、秒數等時間,則可以透過 as.POSIXlt() 配合format參數來設定。

> x<-as.POSIXlt("2026/07/20 18:20:15", format="%Y/%m/%d %H:%M:%S")
[1] "2026-07-20 18:20:15 CST"
> y<-as.POSIXlt("1999/09/21 01:47:15", format="%Y/%m/%d %H:%M:%S")
> x-y
Time difference of 9799.69 days

difftime() 函數配合units參數,不僅可以計算指定單位的時間差,也可以進行時間換算。

> x<-as.POSIXlt("1:47:15", format="%H:%M:%S")
> y<-as.POSIXlt("12:21:59", format="%H:%M:%S")
> y-x
Time difference of 10.57889 hours
> difftime(y, x, units=c("mins"))
Time difference of 634.7333 mins

format() 函數可以擷取特定的日期或時間。

x<-as.POSIXlt("2026/07/20 18:20:15", format="%Y/%m/%d %H:%M:%S")
> format(x, format="%Y")
[1] "2026"
> format(x, format="%m")
[1] "07"
> format(x, format="%d")
[1] "20"
> format(x, format="%A")
[1] "星期一"
> format(x, format="%H")
[1] "18"
> format(x, format="%M")
[1] "20"
> format(x, format="%S")
[1] "15"

常見的format參數設定可以參考下表:

參數 意義 參數 意義
%Y 四位數西元年,例如:2026 %A 英文星期,例如:Saturday
%y 兩位數西元年,例如:26 %a 英文縮寫星期,例如:Sat
%m 兩位數月份,例如:02 %H 小時(24小時制)
%B 英文月份,例如:February %I 小時(12小時制)
%b 英文縮寫月份,例如:Feb %M 分鐘
%d 日期,範圍是01-31 %S

有鑑於時間格式的複雜性, R 的基礎程式處理起來不是那麼直覺,可以考慮下載 lubridate 套件,用更直覺靈活的方法來處理時間。

在 lubridate 套件中,以y代表年, m代表月, d代表日,再搭配h表示小時,m為分鐘與s為秒,使用者可以自行排列組合來定義時間格式。

> library(lubridate) #載入套件
> ymd_hms("2026/07/20 18:20:15") #年月日_時分秒
[1] "2026-07-20 18:20:15 UTC"
> dmy_hm("20/07/2026 18:20") #日月年_時分
[1] "2026-07-20 18:20:00 UTC"
> hm("18:20") #時分
[1] "18H 20M 0S"

有別於 R 內建的 format() 函數, lubridate 要擷取特定日期或時間更為直觀,直接用 year() 、 month() 、 mday() 、 hour() 、 minute() 、 second() 來取得相對應的日期或時間。

如果要計算時間差,則可用 interval() 計算兩個時間物件的時間跨度後,再搭配 as.period() 或 as.duration() 來取得時間差。其中 as.period() 計算的是年月日的差異, as.duration() 則一律計算秒差。

> x<-ymd_hms("2026/07/20 18:20:15")
> y<-ymd_hms("1999/09/21 01:47:15")
> interval(x, y)
[1] 2026-07-20 18:20:15 UTC--1999-09-21 01:47:15 UTC
> as.period(interval(x,y))
[1] "-26y -9m -29d -16H -33M 0S"
> as.duration(interval(x,y))
[1] "-846693180s (~-26.83 years)"

資料類型的轉換

不同資料類型可以透過 R 內建的函數進行轉換,下表呈現相對應的函數:

From / To 數值 字串 邏輯 時間
數值 as.character() as.logical()
字串 as.numeric() as.logical() as.Date()
邏輯 as.character()
時間 as.numeric() format()