屬性
屬性描述了對象所代表的內(nèi)容以及R解釋該對象的方式列吼。很多時候兩個對象之間的唯一差別就在于它們的屬性不同。下表展示了一些重要的屬性僻族。很多常見的屬性都是針對常見的數(shù)值型數(shù)據(jù)對象而言的:像數(shù)組磷脯、矩陣和數(shù)據(jù)框。
屬性 | 描述 |
---|---|
class | 對象的類 |
comment | 對象的注解烤黍;一般用于描述對象的含義 |
dim | 對象的維度 |
dimnames | 與對象的每個維度相關(guān)的名字 |
names | 返回對象的名字屬性。返回結(jié)果取決于對象的類型傻盟,對于數(shù)據(jù)框?qū)ο髸祷財?shù)據(jù)框的列名速蕊,對于數(shù)組會返回數(shù)組中被命名元素的名字 |
row.names | 對象的行名 |
tsp | 對象的起始點。對時間序列對象很有用 |
levels | 因子型變量的水平 |
標(biāo)準(zhǔn)使用方法:對于對象x和屬性a,一般用a(x)來查詢x的a屬性娘赴。
這個操作也可以改變對象的屬性规哲。
我們可以通過attributes
函數(shù)獲得一個包含對象所有屬性的列表。
> m <- matrix(data=1:12, nrow=4, ncol=3,
+ dimnames=list(c("r1","r2","r3","r4"),c("c1","c2","c3")))
> m
c1 c2 c3
r1 1 5 9
r2 2 6 10
r3 3 7 11
r4 4 8 12
> attributes(m)
$dim
[1] 4 3
$dimnames
$dimnames[[1]]
[1] "r1" "r2" "r3" "r4"
$dimnames[[2]]
[1] "c1" "c2" "c3"
用dim
和dimnames
函數(shù)可以直接獲取對應(yīng)屬性的信息诽表。
> dim(m)
[1] 4 3
> dimnames(m)
[[1]]
[1] "r1" "r2" "r3" "r4"
[[2]]
[1] "c1" "c2" "c3"
存在簡便的函數(shù)獲取行名和列名:
> colnames(m)
[1] "c1" "c2" "c3"
> rownames(m)
[1] "r1" "r2" "r3" "r4"
有意思的是唉锌,我們可以通過簡單地改變屬性將矩陣轉(zhuǎn)化為其他類的對象。例如我們通過移除對象的維度屬性竿奏,達到改變類型和類的目的袄简。
> dim(m) <- NULL
> m
[1] 1 2 3 4 5 6 7 8 9 10 11 12
> class(m)
[1] "integer"
> typeof(m)
[1] "integer"
下面我們來比較一下普通一維數(shù)組和二維數(shù)組的異同。
先創(chuàng)建一個數(shù)組a:
> a <- array(1:12, dim=c(3,4))
> a
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
然后泛啸,定義一個包含相同對象的向量:
> b <- 1:12
> b
[1] 1 2 3 4 5 6 7 8 9 10 11 12
我們可以用方括號來操作a中的元素绿语,但對b不能用同樣的方式(因為對象b沒有任何維度)。
> a[2,2]
[1] 5
> b[2,2]
Error in b[2, 2] : 量度數(shù)目不對
咦,這兩個對象在R里面是不是相同的奥来狻种柑?下面用==
看下:
> a == b
[,1] [,2] [,3] [,4]
[1,] TRUE TRUE TRUE TRUE
[2,] TRUE TRUE TRUE TRUE
[3,] TRUE TRUE TRUE TRUE
結(jié)果表明對象的所有元素都是相同的。但這不意味著這兩者完全一樣的匹耕,我們自己也能很明顯感覺它們的差異聚请。
R中有一個all.equal
函數(shù)可以用來比較兩個對象的數(shù)據(jù)和維度以甄別兩個對象是否近乎相同,若不同則會返回其原因泌神。
> all.equal(a,b)
[1] "Attributes: < Modes: list, NULL >"
[2] "Attributes: < Lengths: 1, 0 >"
[3] "Attributes: < names for target but not for current >"
[4] "Attributes: < current is not list-like >"
[5] "target is matrix, current is numeric"
如果我們只care兩個對象是不是完全一致良漱,而不關(guān)心不一致的原因舞虱,可以使用identical
函數(shù)欢际。
> identical(a, b)
[1] FALSE
通過賦予對象b一個維度屬性,可以將b轉(zhuǎn)化為一個與a相同的數(shù)組矾兜。
> dim(b) <- c(3, 4)
> b[2,2]
[1] 5
> all.equal(a,b)
[1] TRUE
> identical(a,b)
[1] TRUE
類
對象的類是對象的屬性之一损趋。對于簡單的對象而言,其類和類型是有緊密聯(lián)系的椅寺。然而浑槽,對于復(fù)合型對象,兩者則可能不同(最常見的是數(shù)據(jù)框返帕,你創(chuàng)建一個然后用class
與typeof
函數(shù)看看就知道了)桐玻。
下面是一個簡單數(shù)值型向量的類型和類:
> x <- c(1,2,3)
> typeof(x)
[1] "double"
> class(x)
[1] "numeric"
與改變其他屬性的操作一樣,我們可以改變R對象所屬的類荆萤。例如镊靴,在計算機內(nèi)部,因子是通過整型數(shù)據(jù)以及整型數(shù)據(jù)到因子水平的映射來實現(xiàn)的(整型數(shù)據(jù)占的存儲空間較少且固定链韭,因此比字符向量更高效)偏竟。
在調(diào)用class
函數(shù)或者typeof
函數(shù)時,對于有些對象敞峭,我們需要對其進行引用以防止其在調(diào)用時被執(zhí)行踊谋。比如,我們想查詢符號x而不是x所指向的對象的類型時旋讹,用如下操作:
> x = 1
> class(quote(x))
[1] "name"
> typeof(quote(x))
[1] "symbol"
# 觀察區(qū)別
> class(x)
[1] "numeric"
> typeof(x)
[1] "double"
學(xué)習(xí)整理自《R核心技術(shù)手冊》