【r<-高級|理論】R中的屬性與類

屬性

屬性描述了對象所代表的內(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"

dimdimnames函數(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)建一個然后用classtypeof函數(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ù)手冊》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末殖蚕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沉迹,更是在濱河造成了極大的恐慌嫌褪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胚股,死亡現(xiàn)場離奇詭異笼痛,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門缨伊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摘刑,“玉大人,你說我怎么就攤上這事刻坊〖纤。” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵谭胚,是天一觀的道長徐块。 經(jīng)常有香客問我,道長灾而,這世上最難降的妖魔是什么胡控? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮旁趟,結(jié)果婚禮上昼激,老公的妹妹穿的比我還像新娘。我一直安慰自己锡搜,他們只是感情好橙困,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耕餐,像睡著了一般凡傅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肠缔,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天夏跷,我揣著相機與錄音,去河邊找鬼桩砰。 笑死拓春,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亚隅。 我是一名探鬼主播硼莽,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼煮纵!你這毒婦竟也來了懂鸵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤行疏,失蹤者是張志新(化名)和其女友劉穎匆光,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酿联,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡终息,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年夺巩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片周崭。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡柳譬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出续镇,到底是詐尸還是另有隱情美澳,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布摸航,位于F島的核電站制跟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酱虎。R本人自食惡果不足惜雨膨,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逢净。 院中可真熱鬧哥放,春花似錦歼指、人聲如沸爹土。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胀茵。三九已至,卻和暖如春挟阻,著一層夾襖步出監(jiān)牢的瞬間琼娘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工附鸽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脱拼,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓坷备,卻偏偏與公主長得像熄浓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子省撑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容