數(shù)據(jù)排序
對(duì)向量排序
對(duì)向量排序主要有三種函數(shù),sort(), rank(), order()函數(shù)。
下面展示三者的用法:
sort()函數(shù)直接對(duì)函數(shù)進(jìn)行排序,并返回排序結(jié)果。
> a <- c(12,4,6,5)
> sort(a)
[1] 4 5 6 12
rank()函數(shù)返回對(duì)應(yīng)元素在排序后的次序。
> rank(a)
[1] 4 1 3 2
order()函數(shù)和which一樣返回的是位置,內(nèi)容依此為排名第一的元素在原向量中的位置,排名第二的元素在原向量中的位置。
> order(a)
[1] 2 4 3 1
order()的核心是可以記錄元素順序抽取的的次序,最直接的用法就是v[order(v)],會(huì)對(duì)元素(numberic、character等)進(jìn)行升序排序。
對(duì)數(shù)據(jù)框排序
在R中,可以使用order()函數(shù)對(duì)一個(gè)數(shù)據(jù)框進(jìn)行排序。默認(rèn)的排序順序是升序。在排序變量的前邊加一個(gè)減號(hào)即可得到降序的排序結(jié)果。下面對(duì)之前的成績的數(shù)據(jù)框進(jìn)行排序:
# 對(duì)數(shù)學(xué)成績進(jìn)行升序排序
> newdata <- score_frame[order(score_frame$Math),]
> newdata
teams Math English mean_score degree
5 WSN 67 90 78.5 Passed
3 FLA 78 78 78.0 Passed
2 NYM 87 87 87.0 Excellent
1 PHI 90 70 80.0 Excellent
4 ATL 90 65 77.5 Passed
# 對(duì)數(shù)學(xué)成績進(jìn)行降序排序
> newdata <- score_frame[order(-score_frame$Math),]
> newdata
teams Math English mean_score degree
1 PHI 90 70 80.0 Excellent
4 ATL 90 65 77.5 Passed
2 NYM 87 87 87.0 Excellent
3 FLA 78 78 78.0 Passed
5 WSN 67 90 78.5 Passed
由上圖表可以看出,在升序排列時(shí),有兩位同學(xué)的數(shù)學(xué)成績都是90,硬要有排名的話,我們可以參照平均成績更高的,我們可以用以下的代碼:
> newdata
teams Math English mean_score degree
5 WSN 67 90 78.5 Passed
3 FLA 78 78 78.0 Passed
2 NYM 87 87 87.0 Excellent
4 ATL 90 65 77.5 Passed
1 PHI 90 70 80.0 Excellent
但是如果列為字符串時(shí)是不能加“-”號(hào)的,這時(shí)就需要decreasing參數(shù)。
數(shù)據(jù)集的合并
1. merge()函數(shù)
在R中可以使用merge()函數(shù)去合并數(shù)據(jù)框,其強(qiáng)大之處在于在兩個(gè)不同的數(shù)據(jù)框中標(biāo)識(shí)共同的列或行。
merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"),
incomparables = NULL, ...)
x,y:用于合并的兩個(gè)數(shù)據(jù)框
by,by.x,by.y:指定依據(jù)哪些行合并數(shù)據(jù)框,默認(rèn)值為相同列名的列.
all,all.x,all.y:指定x和y的行是否應(yīng)該全在輸出文件.
sort:by指定的列是否要排序.
suffixes:指定除by外相同列名的后綴.
incomparables:指定by中哪些單元不進(jìn)行合并.
上面的參數(shù)乍一看好恐怖哦,細(xì)看其實(shí)比較難理解的就是all參數(shù),因此我們先看不需要all參數(shù)的兩個(gè)功能:
1.1.1 橫向合并
> ID<-c(1,2,3,4)
> name<-c("Jim","Tony","Lisa","Tom")
> score<-c(89,22,78,78)
> student1<-data.frame(ID,name)
> print(student1)
ID name
1 1 Jim
2 2 Tony
3 3 Lisa
4 4 Tom
> student2<-data.frame(ID,score)
> print(student2)
ID score
1 1 89
2 2 22
3 3 78
4 4 78
> total_student<-merge(student1,student2,by="ID") #當(dāng)兩個(gè)數(shù)據(jù)集具有相同的列名,by參數(shù)可以省略
> print(total_student)
ID name score
1 1 Jim 89
2 2 Tony 22
3 3 Lisa 78
4 4 Tom 78
1.1.2 取數(shù)據(jù)框交集
若要獲取 cold.states 和 large.states 完全匹配的數(shù)據(jù),我們可以通過以下語句:
> merge(cold.states, large.states)
Name Frost Area
1 Alaska 152 566432
2 Colorado 166 103766
3 Montana 155 145587
4 Nevada 188 109889
我們之后再介紹這里的 cold.states和 large.states 的來源,這里只要理解merge()的意義是取相同。
接下來我們來看all參數(shù)的使用。
merge()函數(shù)支持4種類型數(shù)據(jù)合并:
- Natural join: 僅返回兩數(shù)據(jù)框中匹配的數(shù)據(jù)框行
參數(shù)為:all=FALSE.- Full outer join: 返回兩數(shù)據(jù)框中所有行
參數(shù)為: all=TRUE.- Left outer join: 返回x數(shù)據(jù)框中所有行以及和y數(shù)據(jù)框中匹配的行
參數(shù)為: all.x=TRUE.- Right outer join: 返回y數(shù)據(jù)框中所有行以及和x數(shù)據(jù)框匹配的行
參數(shù)為: all.y=TRUE.
1.2.1 Natural Join
all = FALSE是默認(rèn)參數(shù),因此與之前所舉的例子相同。
1.2.2 Full Outer join
all = TRUE將所有的數(shù)據(jù)都放進(jìn)來,空缺的數(shù)據(jù)補(bǔ)值為NA。
> id = c("1","2","4")
> M = c("7","2","3")
> ink1 = data.frame(id,M)
> id = c("1","2","3")
> C = c("6","8","7")
> ink2=data.frame(id,C)
> merge(ink1,ink2,by="id",all=TRUE)
id M C
1 1 7 6
2 2 2 8
3 4 3 <NA>
4 3 <NA> 7
1.2.3 Left and Right Outer Join
image
上圖展示了authors和books兩個(gè)數(shù)據(jù)框,authors和books有相同屬性的主字段,要將量數(shù)據(jù)框進(jìn)行合并可以采用以下代碼:
by.x指定為"surname",by.y指定為”name“,all.x = TRUE表示要返回authors的數(shù)據(jù)框的所有行,只顯示books的數(shù)據(jù)框的匹配行。
image
所以也就很容易理解all.y = TRUE的情形。
image
2. rbind函數(shù)和cbind函數(shù)
如果要直接橫向合并兩個(gè)矩陣或數(shù)據(jù)框,即簡單的把兩個(gè)數(shù)據(jù)框并排的放在一起,就不需要指定一個(gè)公共索引,這樣可以直接使用cbind()函數(shù)。
#橫向合并
> ID<-c(1,2,3,4)
> name<-c("Jim","Tony","Lisa","Tom")
> score<-c(89,22,78,78)
> student1<-data.frame(ID,name)
> print(student1)
ID name
1 1 Jim
2 2 Tony
3 3 Lisa
4 4 Tom
> student2<-data.frame(ID,score)
> print(student2)
ID score
1 1 89
2 2 22
3 3 78
4 4 78
> total_student<-cbind(student1,student2,by="ID")
> print(total_student)
ID name ID score by
1 1 Jim 1 89 ID
2 2 Tony 2 22 ID
3 3 Lisa 3 78 ID
4 4 Tom 4 78 ID
若要縱向合并兩個(gè)數(shù)據(jù)框,可以使用rbind()函數(shù),兩個(gè)數(shù)據(jù)框必須擁有相同的變量,不過它們的順序不必一定相同。
#縱向合并
> ID<-c(1,2,3)
> name<-c("Jame","Kevin","Sunny")
> student1<-data.frame(ID,name)
> print(student1)
ID name
1 1 Jame
2 2 Kevin
3 3 Sunny
> ID<-c(4,5,6)
> name<-c("Sun","Frame","Eric")
> student2<-data.frame(ID,name)
> print(student2)
ID name
1 4 Sun
2 5 Frame
3 6 Eric
> total<-rbind(student1,student2)
> print(total)
ID name
1 1 Jame
2 2 Kevin
3 3 Sunny
4 4 Sun
5 5 Frame
6 6 Eric
3. dplyr包
本部分將在dplyr包中介紹。


