【R】向量下標(biāo)和子集

正整數(shù)下標(biāo)

對(duì)向量x, 在后面加方括號(hào)和下標(biāo)可以訪問(wèn)向量的元素和子集洞渔。

設(shè)x <- c(1, 4, 6.25)。 x[2]取出第二個(gè)元素占遥; x[2] <- 99修改第二個(gè)元素俯抖。 x[c(1,3)]取出第1、3號(hào)元素瓦胎; x[c(1,3)] <- c(11, 13)修改第1芬萍、3號(hào)元素。 下標(biāo)可重復(fù)搔啊。 例如

> x <- c(1, 4, 6.25)
> x[2]
## [1] 4

> x[2] <- 99; x
## [1]  1.00 99.00  6.25

> x[c(1,3)]
## [1] 1.00 6.25

> x[c(1,3)] <- c(11, 13); x
## [1] 11 99 13

> x[c(1,3,1)]
## [1] 11 13 11

負(fù)整數(shù)下標(biāo)

負(fù)下標(biāo)表示扣除相應(yīng)的元素后的子集柬祠,如

> x <- c(1,4,6.25)
> x[-2]
## [1] 1.00 6.25
> x[-c(1,3)]
## [1] 4

負(fù)整數(shù)下標(biāo)不能與正整數(shù)下標(biāo)同時(shí)用來(lái)從某一向量中取子集, 比如负芋,x[c(1,-2)]沒(méi)有意義漫蛔。

空下標(biāo)與零下標(biāo)

x[]表示取x的全部元素作為子集。 這與x本身不同旧蛾,比如

> x <- c(1,4,6.25)
> x[] <- 999
> x
## [1] 999 999 999

> x <- c(1,4,6.25)
> x <- 999
> x
## [1] 999

x[0]是一種少見(jiàn)的做法莽龟, 結(jié)果返回類型相同、長(zhǎng)度為零的向量锨天, 如numeric(0)毯盈。 相當(dāng)于空集。

當(dāng)與正整數(shù)下標(biāo)一起使用時(shí)會(huì)被忽略病袄。 當(dāng)0與負(fù)整數(shù)下標(biāo)一起使用時(shí)也會(huì)被忽略搂赋。

下標(biāo)超界

設(shè)向量x長(zhǎng)度為, 則使用正整數(shù)下標(biāo)時(shí)下標(biāo)應(yīng)在中取值。 如果使用大于的下標(biāo)益缠, 讀取時(shí)返回缺失值脑奠,并不出錯(cuò)。 給超出的下標(biāo)元素賦值幅慌, 則向量自動(dòng)變長(zhǎng)宋欺, 中間沒(méi)有賦值的元素為缺失值。 例如

> x <- c(1,4,6.25)
> x[5]
## [1] NA

> x
## [1] 1.00 4.00 6.25

> x[5] <- 9
> x
## [1] 1.00 4.00 6.25   NA 9.00

雖然R的語(yǔ)法對(duì)下標(biāo)超界不視作錯(cuò)誤, 但是這樣的做法往往來(lái)自不良的程序思路迄靠, 而且對(duì)程序效率有影響秒咨, 所以實(shí)際編程中應(yīng)避免下標(biāo)超界。

邏輯下標(biāo)

下標(biāo)可以是與向量等長(zhǎng)的邏輯表達(dá)式掌挚, 一般是關(guān)于本向量或者與本向量等長(zhǎng)的其它向量的比較結(jié)果雨席,如

x <- c(1,4,6.25)
x[x > 3]
## [1] 4.00 6.25

取出x的大于3的元素組成的子集。

要注意的是吠式,如果邏輯下標(biāo)中有缺失值陡厘, 對(duì)應(yīng)結(jié)果也是缺失值。 所以特占,在用邏輯下標(biāo)作子集選擇時(shí)糙置, 一定要考慮到缺失值問(wèn)題。正確的做法是加上!is.na前提是目, 如

> x <- c(1, 4, 6.25, NA)
> x[x > 2]
## [1] 4.00 6.25   NA

> x[!is.na(x) & x > 2]
## [1] 4.00 6.25

which()谤饭、which.min()、which.max()函數(shù)

函數(shù)which()可以用來(lái)找到滿足條件的下標(biāo)懊纳, 如

> x <- c(3, 4, 3, 5, 7, 5, 9)
> which(x > 5)
## [1] 5 7

> seq(along=x)[x > 5]
## [1] 5 7

這里seq(along=x)會(huì)生成由x的下標(biāo)組成的向量揉抵。 用which.min()、which.max求最小值的下標(biāo)和最大值的下標(biāo)嗤疯, 不唯一時(shí)只取第一個(gè)冤今。如

> which.min(x)
## [1] 1

> which.max(x)
## [1] 7

元素名

向量可以為每個(gè)元素命名。如

> ages <- c("李明"=25,"田曉霞"=21,"孫少平"=22)
> ages
## 李明 田曉霞 孫少平 
    25     21     22

或者

> ages <- c(25,21,22)
> names(ages)<- c("李明","田曉霞","孫少平")
> ages
## 李明 田曉霞 孫少平 
    25     21     22 

或者

> ages <- setNames(c(25,21,22),c("李明","田曉霞","孫少平"))
> ages
## 李明 田曉霞 孫少平 
    25     21     22 

這時(shí)可以用元素名或元素名向量作為向量的下標(biāo)茂缚,如

> ages["李明"]
## 李明 
  25

> ages["李明"] <- 11
> ages
## 李明 田曉霞 孫少平 
    11     21     22 

這實(shí)際上建立了字符串到數(shù)值的映射表戏罢。

用字符串作為下標(biāo)時(shí), 如果該字符串不在向量的元素名中脚囊, 讀取時(shí)返回缺失值結(jié)果龟糕, 賦值時(shí)該向量會(huì)增加一個(gè)元素并以該字符串為元素名。

帶有元素名的向量也可以是字符型或其它基本類型悔耘,如

> sex <- c("孫少平"="男","田曉霞"="女")
> sex
## 孫少平 田曉霞 
  "男"   "女" 

除了給向量元素命名外翩蘸, 在矩陣和數(shù)據(jù)框中還可以給行、列命名淮逊, 這會(huì)使得程序的擴(kuò)展更為容易和安全。

R允許僅給部分元素命名扶踊, 這時(shí)其它元素名字為空字符串泄鹏。 不同元素的元素名一般應(yīng)該是不同的, 否則在使用元素作為下標(biāo)時(shí)會(huì)發(fā)生誤讀秧耗, 但是R語(yǔ)法允許存在重名备籽。

用unname(x)返回去掉了元素名的x的副本, 用names(x) <- NULL可以去掉x的元素

> unname(ages)
## [1] 11 21 22

> ages
## 李明 田曉霞 孫少平 
    11     21     22 

> names(ages) <- NULL
> ages
## [1] 11 21 22

用R向量下標(biāo)作映射

R在使用整數(shù)作為向量下標(biāo)時(shí),允許使用重復(fù)下標(biāo)车猬, 這樣可以把數(shù)組x看成一個(gè)的整數(shù)到 x[1], x[2], , x[n]的一個(gè)映射表, 其中是x的長(zhǎng)度霉猛。 比如,某商店有三種禮品珠闰,編號(hào)為1,2,3惜浅, 價(jià)格分別為68, 88和168。令

> price.map <- c(68, 88, 168)

設(shè)某個(gè)收銀員在一天內(nèi)分別售出禮品編號(hào)為3,2,1,1,2,2,3伏嗜, 可以用如下的映射方式獲得售出的這些禮品對(duì)應(yīng)的價(jià)格:

> items <- c(3,2,1,1,2,2,3)
> y <- price.map[items]; print(y)
## [1] 168  88  68  68  88  88 168

R向量可以用字符型向量作下標(biāo)坛悉, 字符型下標(biāo)也允許重復(fù), 所以可以把帶有元素名的R向量看成是元素名到元素值的映射表承绸。 比如裸影,設(shè)sex為10個(gè)學(xué)生的性別(男、女)

> sex <- c("男", "男", "女", "女", "男", "女", "女", "女", "女", "男")

希望把每個(gè)學(xué)生按照性別分別對(duì)應(yīng)到藍(lán)色和紅色军熏。 首先建立一個(gè)R向量當(dāng)作映射

> sex.color <- c("男"="blue", "女"="red")

用R向量sex.color當(dāng)作映射轩猩,可以獲得每個(gè)學(xué)生對(duì)應(yīng)的顏色

> cols <- sex.color[sex]; print(cols)
##     男     男     女     女     男     女     女     女     女     男 
## "blue" "blue"  "red"  "red" "blue"  "red"  "red"  "red"  "red" "blue"

這樣的映射結(jié)果中帶有不必要的元素名, 用unname()函數(shù)可以去掉元素名荡澎,如

> unname(cols)
##  [1] "blue" "blue" "red"  "red"  "blue" "red"  "red"  "red"  "red"  "blue"

集合運(yùn)算

可以把向量x看成一個(gè)集合均践,但是其中的元素允許有重復(fù)。 用unique(x)可以獲得x的所有不同值衔瓮。如

> unique(c(1, 5, 2, 5))
## [1] 1 5 2

用a %in% x判斷a的每個(gè)元素是否屬于向量x浊猾,如

> 5 %in% c(1,5,2)
## [1] TRUE

> c(5,6) %in% c(1,5,2)
## [1]  TRUE FALSE

與%in運(yùn)算符類似, 函數(shù)match(x, table)對(duì)向量x的每個(gè)元素热鞍, 從向量table中查找其首次出現(xiàn)位置并返回這些位置葫慎。 沒(méi)有匹配到的元素位置返回NA_integer_(整數(shù)型缺失值)。 如

> match(5, c(1,5,2))
## [1] 2

> match(5, c(1,5,2,5))
## [1] 2

> match(c(2,5), c(1,5,2,5))
## [1] 3 2

> match(c(2,5,0), c(1,5,2,5))
## [1]  3  2 NA

用intersect(x,y)求交集薇宠,結(jié)果中不含重復(fù)元素偷办,如

> intersect(c(5, 7), c(1, 5, 2, 5))
## [1] 5

用union(x,y)求并集,結(jié)果中不含重復(fù)元素澄港,如

> union(c(5, 7), c(1, 5, 2, 5))
## [1] 5 7 1 2

用setdiff(x,y)求差集椒涯,即x的元素中不屬于y的元素組成的集合, 結(jié)果中不含重復(fù)元素回梧,如

> setdiff(c(5, 7), c(1, 5, 2, 5))
## [1] 7

用setequal(x,y)判斷兩個(gè)集合是否相等废岂, 不受次序與重復(fù)元素的影響,如

> setequal(c(1,5,2), c(2,5,1))
## [1] TRUE

> setequal(c(1,5,2), c(2,5,1,5))
## [1] TRUE

練習(xí)

設(shè)文件class.csv內(nèi)容如下:

name,sex,age,height,weight
Alice,F,13,56.5,84
Becka,F,13,65.3,98
Gail,F,14,64.3,90
Karen,F,12,56.3,77
Kathy,F,12,59.8,84.5
Mary,F,15,66.5,112
Sandy,F,11,51.3,50.5
Sharon,F,15,62.5,112.5
Tammy,F,14,62.8,102.5
Alfred,M,14,69,112.5
Duke,M,14,63.5,102.5
Guido,M,15,67,133
James,M,12,57.3,83
Jeffrey,M,13,62.5,84
John,M,12,59,99.5
Philip,M,16,72,150
Robert,M,12,64.8,128
Thomas,M,11,57.5,85
William,M,15,66.5,112

用如下程序可以把上述文件讀入為R數(shù)據(jù)框d.class, 并取出其中的name和age列到變量name和age中:

> d.class <- read.csv("class.csv", header=TRUE, stringsAsFactors=FALSE)
> name <- d.class[,"name"]
> age <- d.class[,"age"]
> age
 [1] 13 13 14 12 12 15 11 15 14 14 14 15 12 13 12 16 12 11 15
> d.class
      name sex age height weight
1    Alice   F  13   56.5   84.0
2    Becka   F  13   65.3   98.0
3     Gail   F  14   64.3   90.0
4    Karen   F  12   56.3   77.0
5    Kathy   F  12   59.8   84.5
6     Mary   F  15   66.5  112.0
7    Sandy   F  11   51.3   50.5
8   Sharon   F  15   62.5  112.5
9    Tammy   F  14   62.8  102.5
10  Alfred   M  14   69.0  112.5
11    Duke   M  14   63.5  102.5
12   Guido   M  15   67.0  133.0
13   James   M  12   57.3   83.0
14 Jeffrey   M  13   62.5   84.0
15    John   M  12   59.0   99.5
16  Philip   M  16   72.0  150.0
17  Robert   M  12   64.8  128.0
18  Thomas   M  11   57.5   85.0
19 William   M  15   66.5  112.0
  1. 求出age中第3, 5, 7號(hào)的值狱意;

     > age[c(3,5,7)]
     ## [1] 14 12 11
    
  2. 用變量age, 求出達(dá)到15歲及以上的那些值湖苞;

     > age[age>=15]
     ## [1] 15 15 15 16 15 
    
  3. 用變量name和age, 求出Mary與James的年齡。

     > set <- setNames(age,name)
     > set[match(c("Mary","James"),name)]
      Mary James 
        15    12 
    
  4. 求age中除Mary與James這兩人之外的那些人的年齡值详囤,保存到變量age1中财骨。

    > a <- match(c("Mary","James"),name)
    > b <- (1:length(name))
    
    > a
    [1]  6 13
    > b
     [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19
    
    > age1 <- set[setdiff(b,a)]
    > age1
      Alice   Becka    Gail   Karen   Kathy   Sandy  Sharon   Tammy  Alfred    Duke   Guido 
         13      13      14      12      12      11      15      14      14      14      15 
    Jeffrey    John  Philip  Robert  Thomas William 
         13      12      16      12      11      15 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子隆箩,更是在濱河造成了極大的恐慌该贾,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捌臊,死亡現(xiàn)場(chǎng)離奇詭異杨蛋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)娃属,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)六荒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人矾端,你說(shuō)我怎么就攤上這事掏击。” “怎么了秩铆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵砚亭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我殴玛,道長(zhǎng)捅膘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任滚粟,我火速辦了婚禮寻仗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凡壤。我一直安慰自己署尤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布亚侠。 她就那樣靜靜地躺著曹体,像睡著了一般。 火紅的嫁衣襯著肌膚如雪硝烂。 梳的紋絲不亂的頭發(fā)上箕别,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音滞谢,去河邊找鬼串稀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狮杨,可吹牛的內(nèi)容都是我干的母截。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼禾酱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起颤陶,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颗管,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后滓走,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體垦江,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年搅方,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了比吭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姨涡,死狀恐怖衩藤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涛漂,我是刑警寧澤赏表,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站匈仗,受9級(jí)特大地震影響瓢剿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悠轩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一间狂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧火架,春花似錦鉴象、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至音比,卻和暖如春俭尖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洞翩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工稽犁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骚亿。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓已亥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親来屠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虑椎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354