iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 9
0
Big Data

R語言與機器學習見面會系列 第 9

Day09 R語言的資料型別(Type)

前面3天,重新認識了R語言的判斷(ifelse)、迴圈(loop)及函式(function),算是剛好可以把職業欄改成R語言碼農了,但R語言碼農還有很多要學習,今天來砍就R語言基礎Part4

  • 基本型別
  • 檢查型別函式
  • 轉換函式
  • NA處理

依稀記得國小時,外公在關西的果園採收後,幾個阿姨和媽媽會開始按照水果的大小作分級裝箱,選果的作業全憑女性長輩們的經驗放在不同size的箱子;後來農會有補助,外公買了厲害的自動選果機(就是哪種把水果倒下去輸送帶上,她會自動滾到適合自己size的箱子),我們小人們超愛圍在機器旁裝忙,這種自動化很神奇,

上一篇文章的最後,我們探索到R語言自動推斷型別的能力,接下來我們再往資料走近一步,來認識R語言常用的資料型別。

R語言基本資料型別


就像其他程式語言中的變數(object)有著型別(Data Type),在R語言中,向量也有六種基本的資料型別:

  • 字元(character): 文字字串,用雙引號包起來。
  • 數值(numeric): 雙倍精準度數值,簡單的形容就是double。
  • 整數(integer): 沒有小數位的數值。
  • 複數(complex): 虛數,實際還沒用過。
  • 邏輯(logical): TRUE /FALSE,也可以縮寫成T/F。
  • 資料列: 很少使用到。

基本的三劍客 字串、數值還有日期,疑,就少了日期! 快補上她的位置。

  • 日期時間: POSIXct、POSIXt

變數的指派


變數要指派的運算子也很簡單,三個同義的方式:

  • = (R Manual有提到有些地方,沒辦法適用)
  • <- 最佳
  • -> (也有右向箭頭,但不建議,習慣一種就好)

http://stat.ethz.ch/R-manual/R-patched/library/base/html/assignOps.html

變數命名限制:


自動型別推斷(type inference)


來體驗R語言中的自動型別推斷(type inference),碼農的自動選果分級機,我外公也有一台厲害的!
我們在資料夾MyR新增一支Day09.R

http://ithelp.ithome.com.tw/upload/images/20161209/20103434uOsKjNlC15.png

在Day09.r輸入以下程式碼

字元

v <- "正妹身高" 
print(class(v)) 
print(typeof(v)) 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434RQDfxdw7oj.png
自動推斷character

數值

v <- 160.5 
print(class(v)) 
print(typeof(v))

http://ithelp.ithome.com.tw/upload/images/20161209/20103434WBU6WMoapy.png
自動推斷成數值

整數

v <- 47L 
print(class(v)) 
print(typeof(v)) 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434QyiNOELv7S.png

複數

v <- 1+2i 
print(class(v)) 
print(typeof(v)) 

http://ithelp.ithome.com.tw/upload/images/20161209/201034341veGl7hFj1.png

邏輯

v <- TRUE 
print(class(v)) 
print(typeof(v)) 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434O60pgABDN0.png

資料列

v <- charToRaw("Hello") 
print(class(v)) 
print(typeof(v)) 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434GbDgJ7M5wU.png

日期 POSIXct、POSIXt

v <- Sys.time() 
print(class(v)) 
print(typeof(v)) 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434UDqQjeG3P6.png

雖然R語言有自動推斷,不過推斷還是有關鍵字元。

  • 有雙引號的為字元
  • 看起來像數值,但沒有L標示的是雙倍精準度數值
  • 看起來像數值,但標示L為整數數值。
  • 有i(虛數)節尾的數值,推斷為複數
  • TRUE/FALSE或T/F保留字判定為logical

檢查資料是否為指定型別


  • is.character(v)
  • is.numeric(v)
  • is.integer(v)
  • is.complex(v)
  • is.logical(v)
  • is.na(v)
  • isDate(v)

在Day09.r輸入以下程式碼

字元

print("字元結果:") 
is.character(1) 
is.character("1") 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434yZypfwQmIR.png

""引號重要!

數值

print("數值結果:") 
is.numeric(1) 
is.numeric("1") 

http://ithelp.ithome.com.tw/upload/images/20161209/2010343439y6yIQxGa.png

整數

print("整數結果:") 
is.integer(3.14) 
is.integer(3) 
is.integer(as.integer(3)) 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434TrvS2t2pWn.png
必要用轉換的招!

邏輯

print("邏輯結果:") 
is.logical(TRUE) 
is.logical(T) 
is.logical("TRUE") 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434HtdhiZ70Y5.png
保留字TRUE FALSE T F

是否為null

is.na(NA) 
is.na("") 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434K9Y6ZSLX20.png
保留字NA
空字串和Null不同,Null是指值的狀態。

日期,手作一個

isDate <- function(x) { 
    tryCatch(!is.na(as.Date(x, date.format = "%Y/%m/%d")), 
           error = function(err) { 
               FALSE 
           }) 
} 
 
isDate("2016/12/31")  
isDate("2016/12/32") 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434Yhpfnis164.png

型別間轉換函式


在Day09.r輸入以下程式碼

轉換為字串

as.character(3.14) 
as.character(1) 
as.character(TRUE) 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434mogc0TTQEb.png

轉換為數值

as.numeric("-3.14") 
as.numeric("-3") 
as.numeric(TRUE) 
as.numeric("3點14") 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434MaDtZJbeyo.png
TRUE轉換為1,最後一個"3點14"轉換失敗,回傳NA

轉換為整數

as.integer("-3.14") 
as.integer("-3") 
as.integer(TRUE) 
as.integer("3點14") 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434BHu3Iae1or.png
轉換為整數位,小數位會被Truncate掉
最後一個"3點14"轉換失敗,回傳NA

轉換為日期

as.Date("2016/12/31", date.format = "%Y/%m/%d")  
as.Date("2016/02/30", date.format = "%Y/%m/%d") 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434u7WgO0eL64.png

NA狀態處理


R語言中的Null值(空值)是以NA表示,Null代表著物件值的狀態,不能作為運算。

在Day09.r輸入以下程式碼

is.na(NA) 
#轉換失敗時拋回NA 
x <- as.numeric("3點14") 
x 
is.na(NA) 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434zdUeG3zTzI.png

資料型別名詞


R語言的資料型別名詞:

  • Class
  • Type
  • Mode
  • storage.mode

大多數狀況是相同的:

  • Class比較像程式執行時識別封裝後變數使用的
  • type和stroage.mode則是接近儲存時的型態
  • 為了和S語言相容多了mode:

.NET/Java世界中,Class是藍圖,實體則通常是物件object。

好!先停,我們舉個R語言內建資料集的案例來觀察Variable Explorer(熱鍵Ctrl + 8)就好:

查詢內建資料集

data() 

http://ithelp.ithome.com.tw/upload/images/20161209/20103434ZepOHbkxTF.png

R語言datasets package中有內建的資料集,有時安裝新的Package後(rpartrMapsdplyr..),也會有練習用的資料集。

v1 <- HairEyeColor
print(class(v1))
print(typeof(v1))
print(mode(v1))
print(storage.mode(v1))

print("---我是分隔線----")

v2 <- cars
print(class(v2))
print(typeof(v2))
print(mode(v2))
print(storage.mode(v2))

Variable Explorer
http://ithelp.ithome.com.tw/upload/images/20161209/20103434szuaojnAAi.png

執行結果:
http://ithelp.ithome.com.tw/upload/images/20161209/20103434AvgTLp3dQu.png

哈!攻城獅初學時先了解classtype,以後有需要再慢慢理解其他的用途。


基礎訓練:
台北田徑場整修到明年世大運,好想跑

http://ithelp.ithome.com.tw/upload/images/20161209/20103434GHUvjqYPVG.png

攝於2015 台北田徑場


上一篇
Day08 R語言的函式(Function)
下一篇
Day10 R語言的資料集合種類
系列文
R語言與機器學習見面會30

尚未有邦友留言

立即登入留言