【R】數據類型及性質

存儲模式與基本類型

R的變量可以存儲多種不同的數據類型, 可以用typeof()函數來返回一個變量或表達式的類型。比如

> typeof(1:3)
## [1] "integer"

> typeof(c(1,2,3))
## [1] "double"

> typeof(c(1, 2.1, 3))
## [1] "double"

> typeof(c(TRUE, NA, FALSE))
## [1] "logical"

> typeof('Abc')
## [1] "character"

> typeof(factor(c('F', 'M', 'M', 'F')))
## [1] "integer"

注意因子的結果是integer而不是因子。

R還有兩個函數mode()和storage.mode()起到與typeof()類似的作用, 這是爲了提供與S語言兼容所遺留的, 應停止使用。

R中數據的最基本的類型包括logical, integer, double, character, complex, raw, 其它數據類型都是由基本類型組合或轉變得到的。 character類型就是字符串類型, raw類型是直接使用其二進制內容的類型。 爲了判斷某個向量x保存的基本類型, 可以用is.xxx()類函數, 如is.integer(x), is.double(x), is.numeric(x), is.logical(x), is.character(x), is.complex(x), is.raw(x)。 其中is.numeric(x)對integer和double內容都返回真值。

在R語言中數值一般看作double, 如果需要明確表明某些數值是整數, 可以在數值後面附加字母L,如

> is.integer(c(1, -3))
## [1] FALSE

> is.integer(c(1L, -3L))
## [1] TRUE

整數型的缺失值是NA, 而double型的特殊值除了NA外, 還包括Inf, -Inf和NaN, 其中NaN也算是缺失值, Inf和-Inf不算是缺失值。 如:

c(-1, 0, 1)/0
## [1] -Inf  NaN  Inf
is.na(c(-1, 0, 1)/0)
## [1] FALSE  TRUE FALSE

對double類型,可以用is.finite()判斷是否有限值, NA、Inf, -Inf和NaN都不是有限值; 用is.infinite()判斷是否Inf或-Inf; is.na()判斷是否NA或NaN; is.nan()判斷是否NaN。

嚴格說來, NA表示邏輯型缺失值, 但是當作其它類型缺失值時一般能自動識別。 NA_integer_是整數型缺失值, NA_real是double型缺失值, NA_character_是字符型缺失值。

在R的向量類型中, integer類型、double類型、logical類型、character類型、還有complex類型和raw類型稱爲原子類型(atomic types), 原子類型的向量中元素都是同一基本類型的。 比如, double型向量的元素都是double或者缺失值。

除了原子類型的向量, 在R語言的定義中, 向量還包括後面要講到的列表(list), 列表的元素不需要屬於相同的基本類型, 而且列表的元素可以不是單一基本類型元素。 用typeof()函數可以返回向量的類型, 列表返回結果爲"list":

> typeof(list("a", 1L, 1.5))
## [1] "list"

原子類型的各個元素除了基本類型相同, 還不包含任何嵌套結構,如:

c(1, c(2,3, c(4,5)))
## [1] 1 2 3 4 5

R有一個特殊的NULL類型, 這個類型只有唯一的一個NULL值, 表示不存在。 NULL長度爲0, 不能有任何屬性值。 用is.null()函數判斷某個變量是否取NULL。

NULL值可以用來表示類型未知的零長度向量, 如c()沒有自變量時返回值就是NULL; 也經常用作函數缺省值, 在函數內用is.null()判斷其缺省後再用一定的計算邏輯得到真正的缺省情況下的數值。

要把NULL與NA區分開來, NA是有類型的(integer、double、logical、character等), NA表示存在但是未知。 數據庫管理系統中的NULL值相當於R中的NA值。

類型轉換與類型升檔

可以用as.xxx()類的函數在不同類型之間進行強制轉換。 如

as.numeric(c(FALSE, TRUE))
## [1] 0 1
as.character(sqrt(1:4))
## [1] "1"                "1.4142135623731"  "1.73205080756888" "2"

類型轉換也可能是隱含的,比如, 四則運算中數值會被統一轉換爲double類型, 邏輯運算中運算元素會被統一轉換爲logical類型。 邏輯值轉換成數值時,TRUE轉換成1, FALSE轉換成0。

在用c()函數合併若干元素時, 如果元素基本類型不同, 將統一轉換成最複雜的一個,複雜程度從簡單到複雜依次爲: logical<integer<double<character。 這種做法稱爲類型升檔,如

c(FALSE, 1L, 2.5, "3.6")
## [1] "FALSE" "1"     "2.5"   "3.6"

不同類型參與要求類型相同的運算時, 也會統一轉換爲最複雜的類型, 也稱爲類型升檔, 如:

> TRUE + 10
## [1] 11

> paste("abc", 1)
## [1] "abc 1"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章