您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么用R語言實現數據合并與追加”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么用R語言實現數據合并與追加”吧!
數據合并操作涉及以下幾個問題:
橫向合并;
1. 是否需要匹配字段
1.1 匹配字段合并
1.1.1 主字段同名
1.1.2 主字段不同名
1.2 無需匹配字段合并
縱向合并:(情況比較簡單,列字段數量相同,名稱相同)
因為縱向合并情況比較簡單,所以本篇講解也著重以橫向合并為主,按照以上幾個問題,需要用到的函數列舉如下:
cbind rbind merge plyr::join tidyr:: inner_join/full_join/left_join/right_join
首先介紹base內置的兩三個函數:
cbind rbind merge
###橫向追加(無需匹配字段)
數據集構造如下:
ID<-c(1,2,3,4)
Name<-c("A","B","C","D")
Score<-c(60,70,80,90)
Sex<-c("M","F","M","M")
One<-data.frame(ID,Name)
Two<-data.frame(Score,Sex)
合并:
Total<-cbind(One,Two)
可以看到cbind函數橫向合并無需匹配主字段,僅僅是將兩個數據集橫向拼接在一起。
###縱向合并
構造數據集:
ID<-c(1,2,3,4)
Name<-c("A","B","C","D")
Student1<-data.frame(ID,Name)
ID<-c(5,6,7,8)
Name<-c("E","F","G","H")
Student2<-data.frame(ID,Name)
合并:
Total_student3<-rbind(Student1,Student2)
以上通過rbind函數對Student1,Student2兩個數據集進行縱向合并(也稱追加)。
merge函數:
merge函數主要針對橫向(列字段)合并,而且可以針對主字段(主鍵)進行匹配,如果主字段名稱不同,還可以指定前后相匹配的主字段。
基本語法如下:
merge(x, y, by = , by.x = , by.y = , all = , all.x = , all.y = , sort = , suffixes = , incomparables = , ...)
具體參數解釋如下:
接下來按照名相同與不同分兩種情況介紹;
列名相同:
ID<-c(1,2,3,4)
name<-c("A","B","C","D")
score<-c(60,70,80,90)
student1<-data.frame(ID,name)
student2<-data.frame(ID,score)
total_student1<-merge(student1,student2,by="ID")
#以上兩個數據集有相同的列名(ID)時,by參數可以省略(by="ID")
以上兩個數據集中,authors和books中有相同屬性的主字段(surname&name)但是主字段名稱不同,這里需要給merge函數指定匹配的主字段。
橫向合并的四種類型:
#inner(內部鏈接)只合并交集
m1 <- merge(authors, books, by.x = "surname", by.y = "name")
#left join(左連接)
m2 <- merge(authors, books, by.x = "surname", by.y = "name",all.x=TRUE)
#right join(右連接)
m3 <- merge(authors, books, by.x = "surname", by.y = "name",all.y=TRUE)
#all_join(外連接)
m4 <- merge(authors, books, by.x = "surname", by.y = "name",all=TRUE)
plyr::join函數
join函數源于plyr包(該包作者就是大名鼎鼎的Hadley Wickham,就是ggplot2的開發者,當然它開發的包還有很多),使用前需要加載:
以下是該函數語法:
join(x, y, by = NULL, type = "left", match = "all")
當兩個數據集主字段有相同名稱時,by參數可以省略(by="name"),當名稱不同時,需指定左右兩個數據集匹配的主字段名稱。
join(x,y,by=intersect("Name","name"),type = "left")
以下我只演示相同主字段名稱下的四種類型合并語句:
構造待合并數據集:
x<-data.frame(name=c("John","Paul","George","Ringo","Stuart","Pete"),instrument=c("guitar","bass","guitar","drums","bass","drums"))
y<-data.frame(name=c("John","Paul","George","Ringo","Brian"),band=c("TRUE","TRUE","TRUE","TRUE","FALSE"))
#left_join
data1<-join(x,y,by="name",type = "left")
#right_join
data2<-join(x,y,by="name",type = "right")
#inner_join
data3<-join(x,y,by="name",type = "inner")
#full_join
data4<-join(x,y,by="name",type = "full")
合并函數與merge函數基本相同。
dplyr::inner_join/full_join/left_join/right_join
(告訴你一個不幸的消息,該包作者還是Hadley Wickham,沒辦法,一個贏者通吃的時代,誰讓人家有才任性呢哈哈~_~)
dplyr的數據合并語句要比plyr還要精練:
x<-data.frame(Name=c("John","Paul","George","Ringo","Stuart","Pete"),instrument=c("guitar","bass","guitar","drums","bass","drums"))
y<-data.frame(name=c("John","Paul","George","Ringo","Brian"),band=c("TRUE","TRUE","TRUE","TRUE","FALSE"))
#(1)inner_join(x, y) :只包含同時出現在x,y表中的行
data1<-inner_join(x,y,by=c("Name"="name"))
#(2)left_join(x, y) :包含所有x中以及y中匹配的行
data2<-left_join(x,y,by=c("Name"="name"))
#(3)right_join(x, y,by=c("Name"="name")) :包含所有y中以及x中匹配的行
data3<-right_join(x,y,by=c("Name"="name"))
#(4)full_join(x,y,by=c("Name"="name")) :包含所以x、y中的行
data4<-full_join(x,y,by=c("Name"="name"))
#(5)semi_join(x, y) :包含x中,在y中有匹配的行,結果為x的子集
data5<-semi_join(x,y,by=c("Name"="name"))
#(6)anti_join(x, y) :包含x中,不匹配y的行,結果為x的子集,與semi_join相反
data6<-anti_join(x,y)
以上連接類型中,前四個(內連接、外連接、左連接、右連接)最為常用,大家可以將dplyr和plyr以及merge函數三種連接方式進行對比記憶。
下面聊一列為啥要專門講一節數據連接方式:
因為……
在excel中……
這種數據連接真的……真的……真的……太費勁了
我所知道的連接方式——
第一:手動復制黏貼;(大家不要隨便作死)
第二:最古老的Microsoft Query(藏在excel數據導入菜單的最底層,據說微軟也不更新了,如果的excel是精簡版的,可能都沒法調用,菜單特丑)
第三:數據透視表;Alt+D+P(為啥微軟要把調用數據透視表多表合并的菜單隱藏起來只能用快捷鍵,太煩人了)
第四:微軟的最新商務智能應用——PowerBI(其中的PowerQuery、PowerPivot)
第五:第三方的效率插件(很多VBA大神寫過這些辦公插件,但是我就不愛用,多裝一個,Excel啟動拖后兩秒鐘,時間就是金錢啊你說是不)
以上四種方式(第一種除外),雖說都可以完成數據合并操作,但是效率上不敢恭維,每次都得走一遍菜單流程。如果有點R語言基礎的同學,強烈建議將這些操作放在R中操作,數據導入導出、長寬轉換、橫縱合并,只需修改一下代碼路徑、參數分分鐘搞定。
當然對于有數據庫基礎的同學(相信大部分同學都有吧,應該是大學本科的必修課)來講,寫幾個SQL也可以瞬間完成。
雖然已經N多年沒有用過了,但是還是想在這里獻丑一下:
內連接 inner join
語法:select * from x inner join y on x.Name =y.name
左連接 left join(左表中所有數據,右表中對應數據)
語法:select * from x left join y on x.Name = y.name
右連接 right join(右表中所有數據,左表中對應數據)
語法:select * from x right join y on x.Name = y.name
全連接 full join
語法:select * from x full join y on x.Name = y.name
我是一個比較懶、嫌麻煩但注重效率的人,很多關于數據處理上的需求,如果能用簡單的方式解決(比如VBA、R或者效率函數),我都不會去選擇安裝插件或者外部軟件,一方面太浪費時間,操作麻煩;另一方面,使用插件大多需要用菜單點選,以后遇到同樣的需要還得從新走一遍流程,所以我更傾向用簡單的可重復利用的代碼來解決。
簡單、省事兒、快捷、可重復……
感謝各位的閱讀,以上就是“怎么用R語言實現數據合并與追加”的內容了,經過本文的學習后,相信大家對怎么用R語言實現數據合并與追加這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。