![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2PnVGcq5iYh5WYiJjc3UHcvwlMwgTO0QTMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
資料(集)處理是資料分析過程中的重要環節,今天特别整理資料(集)合并、增減與連接配接的相關内容,并逐一作出示例。
目 錄
1 資料合并
1.1 cbind列合并(等長)
1.2 rbind行合并
2 資料連接配接/比對
2.1 内連接配接
2.2 外連接配接
2.3 左連接配接
2.4 右連接配接
2.5 雙(多)字段内連接配接
3 資料增減
正 文
1 資料合并
1.1 cbind列合并(等長)
總結:cbind等行數、按列合并(無序)
#等長
#生成測試資料
> ID1 <- c(1:4)
> ID2 <- c(2:5)
> name<-c("A","B","C","D")
> score<-c(8,22,7,6)
> student1<-data.frame(ID1,name)
> student2<-data.frame(ID2,score)
> student1
ID1 name
1 1 A
2 2 B
3 3 C
4 4 D
> student2
ID2 score
1 2 8
2 3 22
3 4 7
4 5 6
> cbind(student1,student2) #按照行合并student1和student2
ID1 name ID2 score
1 1 A 2 8
2 2 B 3 22
3 3 C 4 7
4 4 D 5 6
複制
1.2 rbind行合并
總結:按行合并,需要注意資料集需要有相同的列字段名
> #生成測試資料student1
> ID <- c(1:4)
> score <- c(8,22,7,33)
> student1<-data.frame(ID,score)
> #生成測試資料student2
> ID <- c("A","B","C","D")
> score <- c(11,2,55,3)
> student2<-data.frame(ID,score)
> student1
ID score
1 1 8
2 2 22
3 3 7
4 4 33
> student2
ID score
1 A 11
2 B 2
3 C 55
4 D 3
> rbind(student1,student2) #按行合并,需要注意資料集需要有相同的列字段名
ID score
1 1 8
2 2 22
3 3 7
4 4 33
5 A 11
6 B 2
7 C 55
8 D 3
複制
2 資料連接配接/比對
資料連接配接主要涉及到merge函數和dplyr包中的*_join等函數,另外sqldf函數(SQL)亦可以實作資料連接配接功能。本節主要就merge和dplyr::*_join函數做出解釋。
merge函數文法
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"), no.dups = TRUE,
incomparables = NULL, ...)
複制
其中,通過by字段控制連接配接字段by = "ID"為單字段連接配接,by = c("ID","NAME",……)為多字段連接配接;通過all=FALSE/TRUE、all.x = TRUE和all.y = TRUE實作内連接配接、外連接配接、左連接配接和右連接配接
dplyr包中的inner_join、left_join、right_join、full_join文法
inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),
...)
left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),
...)
full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
複制
其中,通過by控制連接配接字段,通過dplyr::*_join中的“*”控制連接配接形式。
> #生成資料集1
> ID<-c(1,2,3)
> name<-c("Jim","Tony","Lisa")
> student1<-data.frame(ID,name)
> #生成資料集1
> ID<-c(1,2,5)
> score<-c(89,22,78)
> student2<-data.frame(ID,score)
> student1
ID name
1 1 Jim
2 2 Tony
3 3 Lisa
> student2
ID score
1 1 89
2 2 22
3 5 78
複制
2.1 内連接配接(指定字段比對輸出)
總結:merge(……,all=FALSE)等價dplyr::inner_join(……)
> #内連接配接
> merge(student1,student2,by="ID",all=FALSE)
ID name score
1 1 Jim 89
2 2 Tony 22
> dplyr::inner_join(student1,student2,by="ID")
ID name score
1 1 Jim 89
2 2 Tony 22
複制
2.2 外連接配接
總結:merge(……,all=TRUE)等價dplyr::full_join(……)所有資料均加入,如無法連接配接則生成NA
> #外連接配接
> merge(student1,student2,by="ID",all=TRUE)
ID name score
1 1 Jim 89
2 2 Tony 22
3 3 Lisa NA
4 5 <NA> 78
> dplyr::full_join(student1,student2,by="ID")
ID name score
1 1 Jim 89
2 2 Tony 22
3 3 Lisa NA
4 5 <NA> 78
複制
2.3 左連接配接
總結:merge(……,all.x=TRUE)等價dplyr::left_join(……)所有左側(x)資料均加入,即使無法連接配接亦保留
> #左連接配接
> merge(student1,student2,by="ID",all.x=TRUE)
ID name score
1 1 Jim 89
2 2 Tony 22
3 3 Lisa NA
> dplyr::left_join(student1,student2,by="ID")
ID name score
1 1 Jim 89
2 2 Tony 22
3 3 Lisa NA
複制
2.4 右連接配接
總結:merge(……,all.y=TRUE)等價dplyr::right_join(……)所有右側(y)資料均加入,即使無法連接配接亦保留
> #右連接配接
> merge(student1,student2,by="ID",all.y=TRUE)
ID name score
1 1 Jim 89
2 2 Tony 22
3 5 <NA> 78
> dplyr::right_join(student1,student2,by="ID")
ID name score
1 1 Jim 89
2 2 Tony 22
3 5 <NA> 78
複制
2.5 雙(多)字段内連接配接
> #生成資料集1
> ID<-c(1,2,3)
> SD <- c(1,2,3)
> name<-c("Jim","Tony","Lisa")
> student1<-data.frame(ID,SD,name)
> #生成資料集1
> ID<-c(1,2,5)
> SD <- c(5,2,3)
> score<-c(89,22,78)
> student2<-data.frame(ID,SD,score)
> student1
ID SD name
1 1 1 Jim
2 2 2 Tony
3 3 3 Lisa
> student2
ID SD score
1 1 5 89
2 2 2 22
3 5 3 78
>
> #多字段内連接配接
> merge(student1,student2,by=c("ID","SD"),all=FALSE)
ID SD name score
1 2 2 Tony 22
> dplyr::inner_join(student1,student2,by=c("ID","SD"))
ID SD name score
1 2 2 Tony 22
複制
3 資料增減
常見如以下不同方法
#方法一:減行數或列數
x=x[,-1] #代表删除x資料集中第一列資料
#方法二:dplyr::mutate
#數值重定義和指派
#将Ozone列取負數指派給new,然後Temp列重新計算為(Temp - 32) / 1.8
mutate(airquality, new = -Ozone, Temp = (Temp - 32) / 1.8)
#方法三:subset篩選變量服從某值的子集
subset(airquality, Temp > 80, select = c(Ozone, Temp))
#方法四:rbind和cbind
複制