R 語言的資料型態

Wush Wu
國立台灣大學

大綱

  1. 分析中的資料形態
  2. R 語言的資料型態
  3. 活用R 語言的資料型態

分析中的資料形態

數值系統的分類

資料衡量尺度 變數形態 特性
1 名目資料(nomial) 質化 類別
2 順序資料(ordinal) 質化 優先順序
3 區間資料(interval) 量化 大小距離
4 比例資料(ratio) 量化 比值

名目資料

  • 數值只用於記號,值毫無意義的數據
  • 範例:
    • 性別
    • Domain
    • Cookie

順序資料

  • 數值有順序關係,但是差距沒有意義
  • 範例:
    • 硬度表
    • 名次
    • 排序表

區間資料

  • 有差距的概念,沒有倍數的概念
  • 數值有1的概念,沒有0的概念。可加減
  • 範例:
    • 溫度
    • 時間

比值資料

  • 同時有差距和倍數的概念。
  • 數值有1和0的概念。可加減乘除。
  • 範例:
    • 營收
    • 股價

小挑戰

  • 請再舉出四種資料形態的範例
  • 眾數、中位數、四分位差和算數平均數能用於哪些資料形態?
  • 對於區間資料,成長率有沒有意義?
  • 在應用Machine Learning的演算法時,不同的資料形態的值能直接使用嗎?
    • Regression
    • Decision Tree
  • 以下資料,各又是怎樣的資料形態呢?
    • 140.118.1.1
    • #R,Text Mining Series,Taiwan R User Group

R 的資料形態

R 的資料形態分類


資料相關的型態

  • Atomic Type: Vector of
    • Integer
    • Numeric
    • Logical
    • R Objects

非資料相關

  • Functions
  • Environments
  • Expressions

什麼是Atomic?

  • 組成R 中變數的最小單位
  • 理解Atomic Type與Atomic Type的組合方法,就可以理解80%的R 物件們

Character

  • 最廣泛的資料結構,可用於處理文字相關的工作,如:設定圖片的標題
  • 輸入的時候利用"'來包覆要輸入的文字
    • 可以直接用\"來輸入"\'
plot(cars, main="\"hello world\"")

plot of chunk character-figure-title

常用的Character處理函數:

字串的剪接:paste

x <- "abc";y <- "bbb"
paste(x, y, sep=",")
## [1] "abc,bbb"

字串的切割:strsplit

strsplit(x, "b")
## [[1]]
## [1] "a" "c"

字串的長度:nchar

nchar(x)
## [1] 3

截取子字串:substring

substring(x, 1, 2)
## [1] "ab"

Logical

  • 產生自比較,或是使用TTRUEFFALSE輸入
x <- 1
x < 2
## [1] TRUE
x <= 1
## [1] TRUE
  • 常用來做流程控制
if (T) {
  print("This is TRUE")
} else {
  print ("This is FALSE")
}
## [1] "This is TRUE"

Logical常用的Operator

NOT

!TRUE
## [1] FALSE

AND

T & T
## [1] TRUE

OR

T | F
## [1] TRUE

Integer and Numeric

+

1 + 2
## [1] 3

-

1 - 2
## [1] -1

*

1 * 2
## [1] 2

/

1L / 2L
## [1] 0.5

向量式資料結構

所有Atomic Type都有長度

length(0L)
## [1] 1

可以利用:c()快速建立Vector

1:3
## [1] 1 2 3
c(1L,2L,3L)
## [1] 1 2 3

向量式的運算

幾乎內建的Operations、Functions都是Vectorize

1:3 + 2:4
## [1] 3 5 7
1:2 + 1:3
## Warning in 1:2 + 1:3: 較長的物件長度並非較短物件長度的倍數
## [1] 2 4 4

向量式資料結構

長度不同會自動延伸

1:2 + 1:3
## Warning in 1:2 + 1:3: 較長的物件長度並非較短物件長度的倍數
## [1] 2 4 4

1 2 1 2
1 2 3


2 4 4

Vectorized的效能都好很多

f1 <- function() 1:1000 + 1
f2 <- function() {
  r <- integer(1000)
  for(i in 1:1000) r[i] <- i + 1
  r
}
expr median(nano seconds)
1 f1() 3434.50
2 f2() 660192.00

向量的同質性

Character > Numeric > Integer > Logical

x <- c(1L, 2.0, "3")
class(x)
## [1] "character"
x
## [1] "1" "2" "3"

改一個,全部就都變了

x <- matrix(1:4, 2, 2)
class(x)
## [1] "matrix"
x[2]
## [1] 2
x[2] <- as.character(x[2])
x
##      [,1] [,2]
## [1,] "1"  "3" 
## [2,] "2"  "4"

R 會在console告訴我們型態

1:2
## [1] 1 2
paste(1:2)
## [1] "1" "2"
c(TRUE, FALSE)
## [1]  TRUE FALSE

活用R 語言的資料型態

為什麼要這樣設計?

  • 處理資料,一定是很多數據,而不是單一的數據
  • 利用R 語言的資料型態來告訴R ,數據在分析上的型態

範例: summary

?summary
summary(1:10)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    3.25    5.50    5.50    7.75   10.00
summary(paste(1:10))
##    Length     Class      Mode 
##        10 character character

型態很重要

  • 在R 中,查詢變數型態的指令有三種
    • class
    • typeof
    • mode

型態很重要

class(1)
## [1] "numeric"
class(1L)
## [1] "integer"
typeof(1)
## [1] "double"
typeof(1L)
## [1] "integer"
mode(1)
## [1] "numeric"
mode(1L)
## [1] "numeric"

型態的用途

  • 儲存上的意義
    • 例如: numericlogicalcharacter
  • 使用上的意義
    • 例如S3方法
    • Date v.s. Integer

小挑戰

  • Atomic Type之中的character, logical, integer, numeric,哪些可以處理質性資料,哪些可以處理量化資料?
  • 根據character, numeric, integer, logical之間的轉換,誰是最廣泛的形態?

自向量中選取資料 [

x <- 11:20
x
##  [1] 11 12 13 14 15 16 17 18 19 20

[ + logical

x < 13
##  [1]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x[x < 13]
## [1] 11 12

[ + integer/numeric

x[1:2]
## [1] 11 12
head(x, 2)
## [1] 11 12

自向量中選取資料 [

names(x) <- letters[1:10]
x
##  a  b  c  d  e  f  g  h  i  j 
## 11 12 13 14 15 16 17 18 19 20
x["d"]
##  d 
## 14
x[c("a", "b")]
##  a  b 
## 11 12

小挑戰

  • 比較有名字與沒有名字的顯示結果後,嘗試回答以下問題:
height <- c("John" = 198, "Tom" = 166, "Peter" = 170)
height
##  John   Tom Peter 
##   198   166   170
  • 請問height是有名字的向量還是沒有名字的向量?
  • 請問heightnumericinteger還是character?

小挑戰

  • 請試著使用[回答以下問題:
    • 請從height中取出"Peter"的資料
    • 請取出身高低於180的資料
    • 請取出身高第二高的資料 hint: ?sort
  • 那一種[來作答最方便?

小挑戰

  • 若經過三年後,他們三人的身高變成:
height2 <- c("Tom" = 170, "Peter" = 185, "John" = 200)
  • 請問他們身高各成長了百分之多少?\(\frac{x_{new} - x_{old}}{x_{old}}\)

Summary

  • 了解型態的用途
  • 了解基礎向量的操作