R語(yǔ)言中的數(shù)據(jù)框
Data Frame一般被譯為數(shù)據(jù)框,感覺(jué)就像是R中的表,由行和列組成,與Matrix不同的是,每個(gè)列可以是不同的數(shù)據(jù)類型,而Matrix是必須相同的。Data Frame每一列有列名,每一行也可以指定行名。如果不指定行名,那么就是從1開(kāi)始自增的Sequence來(lái)標(biāo)識(shí)每一行。所以說(shuō)數(shù)據(jù)框在R語(yǔ)言中可是個(gè)好東西,R中它是用的非常頻繁也是非常有用的數(shù)據(jù)集合。
創(chuàng)建數(shù)據(jù)集
> a1 <- c(1:3) > a2 <- c('a','b','v') > dat <- data.frame(a1,a2) > dat a1 a2 1 1 a 2 2 b 3 3 v
這樣就定義了一個(gè)以a1、a2為兩列的數(shù)據(jù)框,第一列是數(shù)值型,第二列是字符型。
當(dāng)然了,后面會(huì)講到,讀取結(jié)構(gòu)化數(shù)據(jù)文件的話,比如csv、空格或者逗號(hào)分隔的txt文件,我們可以直接用相應(yīng)的read.csv或者是read.table直接讀進(jìn)來(lái)成為數(shù)據(jù)框。
訪問(wèn)元素
訪問(wèn)第一行:
> dat[1,] a1 a2 1 1 a
訪問(wèn)第一列
> dat[,1] [1] 1 2 3
或者是直接引用列名
> dat$a1 [1] 1 2 3
前面講過(guò),可以直接用attach(dat)綁定dat,就不需要數(shù)據(jù)名前綴了,這里還是再?gòu)?fù)習(xí)一遍吧!
>attach(dat) > a1 [1] 1 2 3
使用完后解除綁定,及時(shí)釋放資源,這時(shí)候就不能直接用列名了。
添加新列
比如添加一個(gè)名為a3的列
> dat$a3 <- c('f','m','f') > dat a1 a2 a3 1 1 a f 2 2 b m 3 3 v f
查詢
查詢某一個(gè)列變量滿足某一個(gè)條件或者找指定值用的很多,用which()函數(shù)。
查詢dat中a3列取值為'm'的行,我們可以這樣
> dat[which(dat$a3 == 'm'),] a1 a2 a3 2 2 b m
前面講過(guò),dat[2,]表示dat的第二行,這里which(dat$a3 == 'm')表示滿足條件的行,可以有多個(gè),再加上',',構(gòu)成完整的滿足dat中a3列取值為'm'的行的查詢語(yǔ)句,這個(gè)用的很頻繁,需要重點(diǎn)掌握。
連接、合并
這是R語(yǔ)言數(shù)據(jù)分析基本功。我一般在做R語(yǔ)言網(wǎng)絡(luò)爬蟲(chóng)時(shí)需要把每一張網(wǎng)頁(yè)數(shù)據(jù)整理成數(shù)據(jù)框,然后循環(huán)拼接、合并,最后保存到本地。一般用merge()函數(shù)。
再創(chuàng)建一個(gè)數(shù)據(jù)框dat1
> dat1 <- data.frame(c('q1','q2','q3'),c(1,4,5)) > dat1 c..q1....q2....q3.. c.4.6. 1 q1 4 2 q2 5 3 q3 6 > names(dat1) <- c('a4','a5') > dat1 a4 a5 1 q1 1 2 q2 4 3 q3 5
找出dat的a1屬性值與dat1的a5屬性等值的所有行進(jìn)行按列連接,組成新行。
> dat2 <- merge(dat,dat1,by.x = 'a1',by.y = 'a5') > dat2 a1 a2 a3 a4 1 1 a f q1
學(xué)過(guò)數(shù)據(jù)庫(kù)的人知道,這相當(dāng)于數(shù)據(jù)框庫(kù)操作的迪卡兒等值連接。
關(guān)于R的數(shù)據(jù)框就到這里!
作者:柯廣的網(wǎng)絡(luò)日志
微信公眾號(hào):Java大數(shù)據(jù)與數(shù)據(jù)倉(cāng)庫(kù)