数据选取与简单操作:
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用法的代码)。
- #横向合并
- ID<-c(1,2,3,4)
- name<-c("Jim","Tony","Lisa","Tom")
- score<-c(89,22,78,78)
- student1<-data.frame(ID,name)
- student2<-data.frame(ID,score)
- total_student<-merge(student1,student2,by="ID")#或者rbind()
- total_student
- #纵向合并
- ID<-c(1,2,3)
- name<-c("Jame","Kevin","Sunny")
- student1<-data.frame(ID,name)
- ID<-c(4,5,6)
- name<-c("Sun","Frame","Eric")
- student2<-data.frame(ID,name)
- total<-cbind(student1,student2)
- total
merge的all用法
- >id=c("1","2","3")
- >M=c("7","2","3")
- >ink2=data.frame(id,M)
- >
- >merge(ink1,ink2,by="id",all=T)#所有数据列都放进来,空缺的补值为NA
- idRM
- 1197
- 2272
- 349<NA>
- 43<NA>3
- >merge(ink1,ink2,by="id",all=F)#默认,只取两者的共有的部分
- idRM
- 1197
- 2272
其中,all=T代表全连接,all.x=T代表左联结;all.y=T代表右连接
2、dplyr包
dplyr包的数据合并,
一般用left_join(x,y,by="name") 以x为主,y中匹配到的都放进来, 但,y中没有的则不放过来。
需要这个x数据集是全集,比较大。
3、paste函数
生成一长串字符向量。
- paste(c("X","Y"),1:10,sep="")#"X”,"Y"是长度为2的字符向量,1:10长度为10的向量。命令是让这两个向量粘合在一起生成新的字符串向量,粘合后的新字符之间没有间隔。
- #—————————paste中seq与collapse区别————————————————————
- a=c(1,2,3,4,5)
- names(a)=c('m','n','o','p','q')
- #主要是区分使用sep和collapse
- b=paste(a,names(a),sep="/")#不同向量合并在一起,但是还是各自向量
- c=paste(b,collapse=",")#不同向量合并在一起,但是变成一个向量
- mode(b)#变量类型
- mode(c)
4、cbind和rbind函数
cbind()和rbind(),cbind()按照纵向方向,或者说按列的方式将矩阵连接到一起。
rbind()按照横向的方向,或者说按行的方式将矩阵连接到一起
rbind/cbind对数据合并的要求比较严格:合并的变量名必须一致;数据等长;指标顺序必须一致。相比来说,其他一些方法要好一些,有dplyr,sqldf中的union
5、sqldf包
利用SQL语句来写,进行数据合并,适合数据库熟悉的人,可参考:
R语言︱ 数据库SQL-R连接与SQL语句执行(RODBC、sqldf包)二、数据增减- x=x[,-1]#这个就代表,删除了x数据集中第一列数据
或用dplyr包中的mutate函数
- a=mutate(Hdma_dat,dou=2*survived,dou4=4*survived)
- Hdma_dat$dou=a$dou
- Hdma_dat$dou4=a$dou4#两个新序列,加入到Hdma数据集汇总
筛选变量服从某值的子集
- subset(airquality,Temp>80,select=c(Ozone,Temp))
- subset(airquality,Day==1,select=-Temp)
- subset(airquality,select=Ozone:Wind)
R使用rowSums函数对行求和,使用colSums函数对列求和。
四、不等长合并1、plyr包
rbind.fill函数可以很好将数据进行合并,并且补齐没有匹配到的缺失值为NA。
- #————————————————————————————不等长合并
- #如何解决合并时数据不等长问题——两种方法:do.call函数以及rbind.fill函数(plyr包)
- #rbind.fill函数只能合并数据框格式
- #do.call函数在数据框中执行函数(函数,数据列)
- library("plyr")#加载获取rbind.fill函数
- #第一种方法
- list1<-list()
- list1[[1]]=data.frame(t(data.frame(Job_Pwordseg.ct[1])))
- list1[[2]]=data.frame(t(data.frame(Job_Pwordseg.ct[2])))
- do.call(rbind.fill,list1)
- #第二种方法
- 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()
- mpgcylhpdratwtqsecvsamgearcarbdisp
- (dbl)(dbl)(dbl)(dbl)(dbl)(dbl)(dbl)(dbl)(dbl)(dbl)(dbl)
- 121.061103.902.62016.460144NA
- 221.061103.902.87517.020144NA
- 322.84933.852.32018.611141NA
- 421.461103.083.21519.441031NA
- 517.861233.923.44018.901044167.6
- 616.481803.074.07017.400033275.8
- 717.381803.073.73017.600033275.8
- 815.281803.073.78018.000033275.8
效果是,不匹配到的放在最后,且等于NA NA NA NA