R初級(jí)數(shù)據(jù)管理——數(shù)據(jù)排序與合并

數(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包中介紹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容