R语言基础知识.docx
《R语言基础知识.docx》由会员分享,可在线阅读,更多相关《R语言基础知识.docx(10页珍藏版)》请在冰豆网上搜索。
![R语言基础知识.docx](https://file1.bdocx.com/fileroot1/2023-7/12/8e8fc250-ee71-4ad4-8454-17310d634133/8e8fc250-ee71-4ad4-8454-17310d6341331.gif)
R语言基础知识
R语言基础知识
在做数据处理的时候我们经常会碰到数据合并的问题,比如将两个或者多个相同行数的数据框合并起来(cbind)、将两个或多个等长的向量合并起来(cbind)、或者将不等长的数据框按照某一列合并起来(merge、join)。
下面给大家一一介绍一下这几个函数的用法,并且我们还会在后面附带上Linux中如何用shell这把瑞士军刀来达到R中数据列合并的效果:
1、等长数据框和向量的合并
1.1cbind函数
如果要直接横向合并两个矩阵或数据框,并且不需要指定一个公共索引,那么可以直接使用cbind()函数。
这个函数将横向合并对象A和对象B。
为了让它正常工作,每个对象必须拥有相同的行数,且要以相同顺序排序。
cbind(object1,object2,…)#按列合并对象
例:
>roster
IDStudent
11John
22Angela
33David
44Joel
55Mary
>score
MathScienceEnglish
15029525
26009922
34128018
46258215
55228920
>roster_cbindroster_cbind
IDStudentMathScienceEnglish
11John5029525
22Angela6009922
33David4128018
44Joel6258215
55Mary5228920
如果需要纵向合并两个数据框(数据集)请使用rbind()函数。
在使用rbind()函数时,两个数据框必须拥有相同的变量,不过它们的顺序不必一定相同。
如果dataframeA中拥有dataframeB中没有的变量,在合并它们之前需做以下处理:
(1)删除dataframeA中的多余变量;
(2)在dataframeB中创建追加的变量并将其值设为NA(缺失)。
纵向合并数据通常用于向数据框中添加观测。
2、按列合并
当两个数据框通过一个或者多个共有变量进行联接时(即一种内联结,innerjoin),我们可以使用merge函数,也可以使用plyr包的join函数。
join函数运行速度比merge函数快,数据较大时用join()函数合并数据会节约不少时间。
2.1merge函数
以数据框例:
totalIDtotal_student
IDnamescore
11Jim89
22Tony22
33Lisa78
44Tom78
dataframe的填充默认按列填充;merge()函数较我们之前介绍的cbind()和rbind()两个函数更加”智能”。
2.2join函数
join()函数是plyr包的一个辅助函数。
大家在使用前需要先安装plyr包(install.package("plyr"))。
plyr包遵循三位一体的Split-Apply-Combine(拆分数据,应用函数,组合结果)思想,设置了超过50个函数来应对各类型数据和处理的情况,使数据处理变得极为简单方便,极大地提高了数据处理的效率。
join()函数的一般使用格式为:
join(x,y,by=NULL,type="left",match="all")
作用:
联合两个数据框
参数:
x,y是两个数据框;by是指定要联合的变量,默认值为所有的变量;type是指定联合的方式
例:
>x1join(x,y,by="x2")#若不指定联合的变量会按默认按共同的变量连接
x1x2y1
115NA
22630
33740
448NA
>join(x,y,by="x2",type="inner")#type="inner"表示只是把匹配的情况的列出来
x1x2y1
12630
23740
>join(x,y,by="x2",type="right")#type="right"表示右连接,y中数据全部显示,x中x2中没有1和2,以NA表示。
join()函数中,type的默认值是左连接type="left"。
x2x1y1
11NA10
22NA20
36230
47340
>join(x,y,by="x2",type="left")
x1x2y1
115NA
22630
33740
448NA
>join(x,y,by="x2",type="full")#全部显示
x1x2y1
115NA
22630
33740
448NA
5NA1NA
6NA220
>y[,3]join(x,y,"x2",type="inner",match="first")
x2x1y1V3
262306
373406
3、Linux下的数据列合并
3.1join
在R里面我们有join函数来进行数据列的合并,在Linux下,我们也有jion函数,也是用来进行数据列的合并的,跟R里面的merge和join是类似的功能。
我们来看下它的用法:
join用来将来自两个分类文本文件的行连在一起。
文本文件中的域通常由空格或tab键分隔,但如果愿意,可以指定其他的域分隔符。
一些系统要求使用join时文件域要少于20,为公平起见,如果域大于20,应使用DBMS系统。
为有效使用join,需分别将输入文件分类。
其一般格式为:
join[options]file1file2
选项[options]:
an:
n为一数字,用于连接时从文件n中显示不匹配行。
例如,-a1显示第一个文件的不匹配行,-a2为从第二个文件中显示不匹配行。
o:
n.mn为文件号,m为域号。
1.3表示只显示文件1第三域,每个n,m必须用逗号分隔,如1.3,2.1。
t:
域分隔符。
用来设置非空格或tab键的域分隔符。
例如,指定冒号做域分隔符-t:
。
如果一个文件与另一个文件没有匹配域时怎么办?
这时经常使用指定两个文件的-a选项。
join-a1-a2file1file2
3.2paste
Linux里面的paste函数跟R里面的cbind有点类似,但是不是完全一样。
也是直接将两个文件按列直接拼起来。
[kwu@localhosttest]$cata
12
23
35
49
[kwu@localhosttest]$catb
12
23
35
49
510
[kwu@localhosttest]$pasteab
1212
2323
3535
4949
510
在R语言里面也有paste函数,但是作用跟shell中的不一样。
它是一个字符串处理函数:
paste()函数的一般使用格式为:
paste(...,sep="",collapse=NULL)
其中…表示一个或多个R可以被转化为字符型的对象;参数sep表示分隔符,默认为空格;参数collapse可选,如果不指定值,那么函数paste的返回值是自变量之间通过sep指定的分隔符连接后得到的一个字符型向量;如果为其指定了特定的值,那么自变量连接后的字符型向量会再被连接成一个字符串,之间通过collapse的值分隔。
下面用具体的例子说明各参数的作用:
paste()函数把它的自变量连成一个字符串,中间用空格分开,如
>paste("Hello","world")
[1]"Helloworld"
连接的自变量可以是向量,这时各对应元素连接起来,长度不相同时较短的向量被重复使用。
如
>paste("A",1:
6,sep="")
[1]"A1""A2""A3""A4""A5""A6"
如果希望将一个向量中所有字符连接在一起且中间用逗号分隔,使用paste(x,collapse)即可,结果只是返回一个元素。
或者可以使用函数toString来实现。
但是,toString函数本来就是利用paste来实现的,所以最好还是使用paste()。
>letters[1:
6]
[1]"a""b""c""d""e""f"
>paste(letters[1:
6],collapse=",")
[1]"a,b,c,d,e,f"
同时使用了参数seq与collapse。
>paste("A",1:
6,sep="",collapse=",")
[1]"A1,A2,A3,A4,A5,A6"
如果只是希望向量x中每一个元素和特定的字符(如下划线_)连接,使用paste(x,seq=)即可,如
>letters[1:
4]
[1]"a""b""c""d"
>paste(letters[1:
4],seq='_')
[1]"a_""b_""c_""d_"
3.3awk
下面我们附带一个awk函数的讲解:
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk一般命令行方式:
awk[-Ffield-separator]'commands'input-file(s)
其中,commands是真正awk命令,[-F域分隔符]是可选的。
input-file(s)是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。
通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
若需要合并两个文件的列,可使用如下命令:
awk'NR==FNR{a[i]=$0;i++}NR>FNR{printa[j]""$0;j++}'file1file2#和paste效果类似
若需要合并的列在一个文件里面,可使用如下命令:
awk'{print$1"\t"$2"\t"$4}'input-file(s)#取第1、第2、第4列的数据
例如:
有file1和file2两个文件,需要把file2的第二列合并到file1,使File1并成三列.
[zengqin1@cu01Rwork]$catfile1
IDname
1Jim
2Tony
3Lisa
4Tom
[zengqin1@cu01Rwork]$catfile2
IDscore
189
222
378
478
[zengqin1@cu01Rwork]$joinfile1file2##第一种方法:
利用join将file1和file2合并
IDnamescore
1Jim89
2Tony22
3Lisa78
4Tom78
[zengqin1@cu01Rwork]$pastefile1file2##第二种方法:
利用paste将file1和file2合并
IDnameIDscore
1Jim189
2Tony222
3Lisa378
4Tom478
[zengqin1@cu01Rwork]$pastefile1file2|awk'{print$1"\t"$2"\t"$4}'##第二种方法:
利用paste将file1和file2合并,并去除重复的第三列
IDnamescore
1Jim89
2Tony22
3Lisa78
4Tom78
能够熟练运用数据的列合并方法会给我们的数据处理带来极大的方便,提高我们数据处理的效率。
最新最早最热1条评论2条新浪微博CondaR语言里面如何合并数据,cbind、merge、join函数详解!
还有附带Linux瑞士军刀如何合并数据列!
2015年12月8日回复顶转发社交帐号登录:
微信微博QQ人人更多?
R语言在线正在使用多说