最近仍然在陆陆续续自学,真.生命不息学习不止,这次和大家分享一些实用的数据处理技巧,干货满满!
一、数据合并
涉及函数cbind(),rbind(),bind_rows(),bind_cols().
cbind(),rbind()在我前面写的《R语言编程艺术学习笔记》中已经出现过了,很好用,举个栗子:
> data1<-data.frame(
+ nameA=c("Tom","Jack","Max","Jim"),
+ value=c(24,62,47,16)
+ )
> data1
nameA value
1 Tom 24
2 Jack 62
3 Max 47
4 Jim 16
> data2<-data.frame(
+ nameB=c("Andy","Sun","Gray","Hennry"),
+ value=c(38,21,55,29)
+ )
> data2
nameB value
1 Andy 38
2 Sun 21
3 Gray 55
4 Hennry 29
> cbind(data1,data2)
nameA value nameB value
1 Tom 24 Andy 38
2 Jack 62 Sun 21
3 Max 47 Gray 55
4 Jim 16 Hennry 29
> rbind(data1,data2)
Error in match.names(clabs, names(xi)) : 名字同原来已有的名字不相对
这里定义了两个数据框data1和data2,这里定义nameA、nameB和value三个字段,当使用cbind(),实现按列合并,但使用rbind()是报错了,因为nameA、nameB不同,而rbind()函数要求合并的字段名称必须相同。
为了解决这个问题,使用dplyr包中的bind_rows()函数,不要求合并字段的名称必须相同,这个函数会自己做判断,看例子
> library(dplyr)
> dplyr::bind_rows(data1,data2)
nameA value nameB
1 Tom 24 <NA>
2 Jack 62 <NA>
3 Max 47 <NA>
4 Jim 16 <NA>
5 <NA> 38 Andy
6 <NA> 21 Sun
7 <NA> 55 Gray
8 <NA> 29 Hennry
dplyr::bind_rows中的::表示引用dplyr包中的函数,这里可以看到nameA、nameB各自有一列,value的值合并了,对于nameA中的值在nameB中没有对应的值,则用NA空值表示。
二、数据连接
涉及函数merge()、dplyr包中的inner_join()、left_join()、right_join()、full_join(),通过例子方便大家理解
> table1<-data.frame(
+ Id=c(1,2,3),
+ sex=c("女","男","男")
+ )
> table2<-data.frame(
+ Id=c(1,2,4),
+ age=c(22,17,33)
+ )
> table1
Id sex
1 1 女
2 2 男
3 3 男
> table2
Id age
1 1 22
2 2 17
3 4 33
> merge(table1,table2,by="Id",all=FALSE)#内连接
Id sex age
1 1 女 22
2 2 男 17
> merge(table1,table2,by="Id",all=TRUE)#外连接
Id sex age
1 1 女 22
2 2 男 17
3 3 男 NA
4 4 <NA> 33
> merge(table1,table2,by="Id",all.x=TRUE)#左连接
Id sex age
1 1 女 22
2 2 男 17
3 3 男 NA
> merge(table1,table2,by="Id",all.y=TRUE)#右连接
Id sex age
1 1 女 22
2 2 男 17
3 4 <NA> 33
merge()函数中by用于指定连接的字段,即通过哪个字段进行连接,通过all=TRUE或者FALSE来决定是连接保留相同ID的字段,还是连接展示ID所有字段,all.x指通过第一个数据框进行连接,即保留第一个数据框的所以ID对应值,去掉不包含的;同理all.y指通过第二个数据框进行连接,即保留第二个数据框的所以ID对应值,去掉不包含的。
#用dplyr包进行连接
inner_join(table1,table2,by="id")
left_join(table1,table2,by="id")
right_join(table1,table2,by="id")
full_join(table1,table2,by="id")
dplyr包中则通过控制函数来连接,这个就更加直观好理解些。
> inner_join(table1,table2,by="Id")
Id sex age
1 1 女 22
2 2 男 17
> left_join(table1,table2,by="Id")
Id sex age
1 1 女 22
2 2 男 17
3 3 男 NA
> right_join(table1,table2,by="Id")
Id sex age
1 1 女 22
2 2 男 17
3 4 <NA> 33
> full_join(table1,table2,by="Id")
Id sex age
1 1 女 22
2 2 男 17
3 3 男 NA
4 4 <NA> 33
以上就是今天的小技巧分享内容,希望对你有所帮助,有疑问欢迎提问,下次再见!