• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

R语言数据合并一行代码搞定

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

数据的合并

需要的函数

cbind(),rbind(),bind_rows(),merge()

准备数据

​ 我们先构造一组数据,以便下面的演示

> data1<-data.frame(
+   namea=c("海波","立波","秀波"),
+   value=c("一波","接","一波")
+ )
> data1
  namea value
1  海波  一波
2  立波    接
3  秀波  一波
> data2<-data.frame(
+   nameb=c("柯震东","刘强东","何盛东"),
+   value=c("东去","又","东来")
+ )
> data2
   nameb value
1 柯震东  东去
2 刘强东    又
3 何盛东  东来

按列合并

> cbind(data1,data2)
  namea value  nameb value
1  海波  一波 柯震东  东去
2  立波    接 刘强东    又
3  秀波  一波 何盛东  东来

按行合并

​ 按列合并是cbind(),那么按行合并自然是rbind()

> rbind(data1,data2)
Error in match.names(clabs, names(xi)) : 名字同原来已有的名字不相对

出现了错误,这是因为”namea“ 和”nameb“不同造成的,如果都为"namea" :

> data1<-data.frame(
+   namea=c("海波","立波","秀波"),
+   value=c("一波","接","一波")
+ )
> data1
  namea value
1  海波  一波
2  立波    接
3  秀波  一波
> data2<-data.frame(
+   namea=c("柯震东","刘强东","何盛东"),
+   value=c("东去","又","东来")
+ )
> data2
   namea value
1 柯震东  东去
2 刘强东    又
3 何盛东  东来
> #cbind(data1,data2)
> rbind(data1,data2)
   namea value
1   海波  一波
2   立波    接
3   秀波  一波
4 柯震东  东去
5 刘强东    又
6 何盛东  东来

对数据修改后,没有出现错误。如果 不修改数据该怎么做:

​ 为了解决这个问题,使用dplyr包中的bind_rows()函数,不要求合并字段的名称必须相同,这个函数会自己做判断。

> library(dplyr)
> dplyr::bind_rows(data1,data2)
  namea value  nameb
1  海波  一波   <NA>
2  立波    接   <NA>
3  秀波  一波   <NA>
4  <NA>  东去 柯震东
5  <NA>    又 刘强东
6  <NA>  东来 何盛东

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"),
      incomparables = NULL, ...)

merge函数参数的说明:

x,y:用于合并的两个数据框

by,by.x,by.y:指定依据哪些行合并数据框,默认值为相同列名的列.

all,all.x,all.y:指定x和y的行是否应该全在输出文件.

sort:by指定的列是否要排序.

suffixes:指定除by外相同列名的后缀.

incomparables:指定by中哪些单元不进行合并.

演示merge()

data3<-data.frame(
  name = c("波","东","波","波"),
  type = c("秀","震","秀","秀"),
  class = c(10,5,4,11),
  num = c(85,50,90,90)
);data3
data4<-data_frame(
  name = c("波","东"),
  type = c("海","震"),
  class = c(5,5),
  num = c(88,81)
);data4
#合并data3和data4
> merge(data3,data4,all =T)
  name type class num
1   波   秀     4  90
2   波   秀    10  85
3   波   秀    11  90
4   波   海     5  88
5   东   震     5  50
6   东   震     5  81

#按照name,type,class合并data3.data4
> merge(data3, data4, by =c("name","type","class") , all = T)
  name type class num.x num.y
1   波   秀     4    90    NA
2   波   秀    10    85    NA
3   波   秀    11    90    NA
4   波   海     5    NA    88
5   东   震     5    50    81

欢迎关注


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap