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

R语言数据集合并、数据增减、不等长合并

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

数据选取与简单操作:

which 返回一个向量中指定元素的索引
which.max 返回最大元素的索引
which.min 返回最小元素的索引
sample 随机在向量中抽取元素
subset 根据条件选取元素
sort 升序排列元素
rev 反转所有元素
order 获取排序后的索引
table 返回频数表
cut 将数据分割为几部分
split 按照指定条件分割数据
rbind 行合并
cbind 列合并
merge 按照指定列合并矩阵或者数据框

 

1、merge()函数

最常用merge()函数,但是这个函数使用时候这两种情况需要注意:

1、merge(a,b),纯粹地把两个数据集合在一起,没有沟通a、b数据集的by,这样出现的数据很多,相当于a*b条数据;

2、merge函数是匹配到a,b数据集的并,都有的才匹配出来,如果a、b数据集ID不同,要用all=T(下面有all用法的代码)。

 

[plain] view plain copy
 
 print?
  1. #横向合并  
  2. ID<-c(1,2,3,4)  
  3. name<-c("Jim","Tony","Lisa","Tom")  
  4. score<-c(89,22,78,78)  
  5. student1<-data.frame(ID,name)  
  6. student2<-data.frame(ID,score)  
  7. total_student<-merge(student1,student2,by="ID")  #或者rbind()  
  8. total_student  
[plain] view plain copy
 
 print?
  1. #纵向合并  
  2. ID<-c(1,2,3)  
  3. name<-c("Jame","Kevin","Sunny")  
  4. student1<-data.frame(ID,name)  
  5. ID<-c(4,5,6)  
  6. name<-c("Sun","Frame","Eric")  
  7. student2<-data.frame(ID,name)  
  8. total<-cbind(student1,student2)  
  9. total  

 

merge的all用法

 

[plain] view plain copy
 
 print?
  1. > id=c("1","2","3")  
  2. > M=c("7","2","3")  
  3. > ink2=data.frame(id,M)  
  4. >   
  5. > merge(ink1,ink2,by="id",all=T)  #所有数据列都放进来,空缺的补值为NA  
  6.   id    R    M  
  7. 1  1    9    7  
  8. 2  2    7    2  
  9. 3  4    9 <NA>  
  10. 4  3 <NA>    3  
  11. > merge(ink1,ink2,by="id",all=F)  #默认,只取两者的共有的部分  
  12.   id R M  
  13. 1  1 9 7  
  14. 2  2 7 2  

其中,all=T代表全连接,all.x=T代表左联结;all.y=T代表右连接

 

 

2、dplyr包

 

dplyr包的数据合并,

一般用left_join(x,y,by="name")  以x为主,y中匹配到的都放进来, 但,y中没有的则不放过来。

需要这个x数据集是全集,比较大。

 

 

 

3、paste函数

生成一长串字符向量。

 

[plain] view plain copy
 
 print?
  1. paste(c("X","Y"),1:10,sep="")      #"X”,"Y"是长度为2的字符向量,1:10 长度为10的向量。命令是让这两个向量粘合在一起生成新的字符串向量,粘合后的新字符之间没有间隔。  

[plain] view plain copy
 
 print?
  1. #—————————paste中seq与collapse区别————————————————————  
  2. a = c(1, 2, 3, 4, 5)  
  3. names(a) = c('m', 'n','o', 'p', 'q')  
  4. # 主要是区分使用sep和collapse  
  5. b = paste(a, names(a), sep = "/")          #不同向量合并在一起,但是还是各自向量  
  6. c = paste(b, collapse = ",")               #不同向量合并在一起,但是变成一个向量  
  7. mode(b) #变量类型  
  8. mode(c)  

 

4、cbind和rbind函数

 

 

cbind()和rbind(),cbind()按照纵向方向,或者说按列的方式将矩阵连接到一起。

rbind()按照横向的方向,或者说按行的方式将矩阵连接到一起

 

rbind/cbind对数据合并的要求比较严格:合并的变量名必须一致;数据等长;指标顺序必须一致。相比来说,其他一些方法要好一些,有dplyr,sqldf中的union

 

5、sqldf包

 

利用SQL语句来写,进行数据合并,适合数据库熟悉的人,可参考: 

R语言︱ 数据库SQL-R连接与SQL语句执行(RODBC、sqldf包)

 

 

 

二、数据增减

 

 

[plain] view plain copy
 
 print?
  1. x=x[,-1]  #这个就代表,删除了x数据集中第一列数据  


或用dplyr包中的mutate函数

 

 

[plain] view plain copy
 
 print?
  1. a=mutate(Hdma_dat,dou=2*survived,dou4=4*survived)   
  2. Hdma_dat$dou=a$dou  
  3. Hdma_dat$dou4=a$dou4   #两个新序列,加入到Hdma数据集汇总  

 

筛选变量服从某值的子集

 

[plain] view plain copy
 
 print?
  1. subset(airquality, Temp > 80, select = c(Ozone, Temp))  
  2. subset(airquality, Day == 1, select = -Temp)  
  3. subset(airquality, select = Ozone:Wind)  

 

三、数据纵横加总

R使用rowSums函数对行求和,使用colSums函数对列求和。

 

 

四、不等长合并

 

1、plyr包

rbind.fill函数可以很好将数据进行合并,并且补齐没有匹配到的缺失值为NA。

 

[plain] view plain copy
 
 print?
  1. #————————————————————————————不等长合并  
  2. #如何解决合并时数据不等长问题——两种方法:do.call函数以及rbind.fill函数(plyr包)  
  3. #rbind.fill函数只能合并数据框格式  
  4. #do.call函数在数据框中执行函数(函数,数据列)  
  5. library("plyr")  #加载获取rbind.fill函数  
  6. #第一种方法  
  7. list1<-list()  
  8. list1[[1]]=data.frame(t(data.frame(Job_Pwordseg.ct[1])))  
  9. list1[[2]]=data.frame(t(data.frame(Job_Pwordseg.ct[2])))  
  10. do.call(rbind.fill,list1)  
  11. #第二种方法  
  12. u=rbind.fill(data.frame(t(data.frame(Job_Pwordseg.ct[1]))),data.frame(t(data.frame(Job_Pwordseg.ct[2]))))  

核心函数是plyr包中的rbind.fill函数(合并的数据,必须是data.frame),do.call可以用来批量执行。(do.call用法

 

关于do.call其他用法(R语言 函数do.call()使用 )

 

有一个list,想把里面的所有元素相加求和。发现了两个很有意思的函数

list <- list(matrix(1:25, ncol = 5), matrix(4:28, ncol = 5), matrix(21:45, ncol=5)) 

list.sum<-do.call(sum,list)

list.sum<-do.call(cbind,list)  

do.call() 是告诉list一个函数,然后list里的所有元素来执行这个函数。

 

2、dplyr包

dplyr::bind_rows()

 

[html] view plain copy
 
 print?
  1.     mpg   cyl    hp  drat    wt  qsec    vs    am  gear  carb  disp  
  2.   (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)  
  3. 1  21.0     6   110  3.90 2.620 16.46     0     1     4     4    NA  
  4. 2  21.0     6   110  3.90 2.875 17.02     0     1     4     4    NA  
  5. 3  22.8     4    93  3.85 2.320 18.61     1     1     4     1    NA  
  6. 4  21.4     6   110  3.08 3.215 19.44     1     0     3     1    NA  
  7. 5  17.8     6   123  3.92 3.440 18.90     1     0     4     4 167.6  
  8. 6  16.4     8   180  3.07 4.070 17.40     0     0     3     3 275.8  
  9. 7  17.3     8   180  3.07 3.730 17.60     0     0     3     3 275.8  
  10. 8  15.2     8   180  3.07 3.780 18.00     0     0     3     3 275.8  


效果是,不匹配到的放在最后,且等于NA  NA  NA  NA


鲜花

握手

雷人

路过

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

请发表评论

全部评论

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

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

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

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

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