r语⾔psych包_R语⾔Tidyver包⼊门介绍R语⾔
语⾔学与R语⾔的碰撞
Xu & Yang
PhoneticSan
学习参考
Discovering Statistics Using R
清明粿Statistics for Linguistics with R
How to Do Linguistics with R
为什么放鞭炮
R in Action
大肠面线Analyzing Linguistic Data健康养生常识
R Graphics Cookbook
··· ···
R: The R Project for Statistical Computing
RStudio:
在语⾔学本科专业逐渐兴起的时代,R已经逐渐成为语⾔学学⽣所需掌握的必备技能之⼀。事到如今,
依旧有“数据处理,Python和R到底学哪个”的争辩。今天,我们讲⼀个“让R能够和Python在数据处理⽅⾯⼀较⾼下”的扩展包:tidyver包。本期将介绍以下函数运算:
%>%, tibble, as_tibble, read_csv, read_delim, filter, lect, mutate, group_by, summari, gather, spread
数据处理流程 (R for Data Science, pp. ix)
迄今为⽌,我们的R语⾔⼊门级讲解,都会对已有的数据进⾏预处理,得出漂亮的可视化结果。这些处理都是在ba R上得到的,你可以理解为R内置的⾃带函数,⽐如plot、data.frame等函数。然⽽,
这些函数在进⾏⼤量数据处理的时候,不仅处理繁琐,⽽且语句会显得冗长,可读性较差,降低了数据处理的效率。以此为契机,统计学家Hadley Wickham开发出了⼀系列数据处理的包,整合成为⼀个,这就是tidyver包,它⾥⾯包括了与数据处理相关的内容,如ggplot2,dplyr,tidyr,tibble等等。你可以直接调⽤tidyver,也可以调⽤它所辖属的包。下⾯,我们讲解⼀些tidyver中可能使⽤到的函数,帮助你快速上⼿这个⽅便的东西。同时,我们会⽐较tidyver和ba R 之间的不同之处,帮助你更快理解,为什么tidyver受到更多的推崇。
数据导⼊:tibble
如果已经学过R的⼀些基础教程,或者你读过R in Action这本教材,就会发现,导⼊到R的语⾔学数据,都会成为⼀个data.frame结构的数据,因为它往往包含多个变量。然⽽,这种导⼊往往会莫名地更改⼀些数据的原本格式。有时我们更需要原来的格式,该如何设
置?tidyver下的tibble包帮助我们实现了这⼀想法。如果你直接调⽤了tidyver,那么不需要额外再调⽤tibble。
我爱我校作文tidyver包的内容
tibble是升级版的data.frame格式,它可以保持数据原本的格式,此外,它不会再把放不下的数据多⾏多列显⽰,⽽是以总结形式显⽰够你的屏幕即可。以languageR包中beginningReaders的数据为例,⼀共有13列数据,如果是ba R,直接调⽤会发现,到第9列时已经占不下,它会⾃动换下⼀⾏继续显⽰,显得⼗分冗长。如果转换为tibble格式,它会最多显⽰8列,剩余的内容以解读的形式展现,在每个标头下会显⽰该列数据格式,如int表⽰整数型数据,fct表⽰factor。tibble使得该数据的格式和结构⼀⽬了然。
tibble格式下的数据显⽰
除了创建tibble,以及将已有的格式转变为tibble外,在导⼊时,我们也可以将数据直接以tibble格式导⼊。在之前ba R中,我们使⽤的函数为read.table等,相应的,tidyver包中也有相关函数,且运⾏速度要⽐ba R中的快。以csv格式为例,使⽤read_csv即可,内部结构与ba R的函数⼀致。更⼀般的,如果读取制表分隔符的⽂本数据,使⽤read_delim函数,记得添加⼀句delim='\t'即可。
历史笔记使⽤read_delim导⼊制表分隔符⽂本数据
挡车下⾯我们将tibble包中主要使⽤的函数总结,你可以根据相关代码进⾏体验:
library(languageR)# 加载tidyverlibrary(tidyver)# 创建tibble格式数据a b my_tibble # 将已有数据转变为tibble格式BegReaders # 导⼊数据时直接以tibble格式导⼊数据整理:dplyr/tidyr
tidyver所包含的dplyr包中,囊括了众多数据处理的函数,包括filter、lect、mutate、summari等。在tidyr包中,则有重要的
gather/spread函数帮助我们转换长/宽数据格式。下⾯我们对这些函数的使⽤逐⼀讲解。
⾸先介绍filter函数。正如名字所讲,它所实现的功能是根据条件筛选出符合条件的数据。以languageR中verbs数据为例,假设想选出LengthOfTheme⼤于2的所有数据,并绘制出点状图,那么代码如下:
verbs_f <- filter(verbs, LengthOfTheme > 2)ggplot(verbs_f, aes(RealizationOfRec, LengthOfTheme, color=AnimacyOfRec)) + geom_point()
也可以针对字符串进⾏筛选,如筛选出AnimacyOfRec下属于animate的数据,那么应写为:
filter(verbs, AnimacyOfRec == 'animate')
不过从上⾯的代码可以看到,这样写内容确实还是冗长的,⽽且verbs数据是在重复使⽤,并没有体验到与ba R有差别的地⽅。下⾯,我
们介绍tidyver中最重要的函数之⼀:管道运算%>%,是它将代码变得简洁易懂。通俗解释,将运算符左侧的内容应⽤到右边的内容去。
如上⾯verbs的处理,我们可以这样使⽤:高考古诗
verbs %>% as_tibble() %>% filter(LengthOfTheme > 2) %>% ggplot(aes(RealizationOfRec, LengthOfTheme, color=AnimacyOfRec)) + geom_point()
⽤语⾔解释⼀下即:将verbs数据应⽤到as_tibble中转换为tibble格式,然后筛选转变后的数据,最后将筛选出来的数据绘图。%>%的存在
让整个代码显得简洁⾼效,可读性也⼤⼤提⾼。
第⼆个lect函数可以选择特定的⼀列或多列数据。与filter不同,filter可以筛选出⾏的数据,⽽lect则是筛选出列的数据。以verbs为
例,具体代码和运⾏效果如下:
# 筛选出⼀列lect(verbs, Verb)# 筛选出多列lect(verbs, Verb, LengthOfTheme)lect(verbs, Verb:LengthOfTheme)# 筛选出除特定列外的其他列lect(verbs, -V
如果想要改变tibble中的数据,或者增加变量,那么你可以使⽤mutate函数,它的主要功⽤是增加⼀列新的数据变量,并与已有数据对应起
来。以beginningReaders数据为例,上⾯我们已经转换为tibble格式了,存到了BegReaders变量中。我想筛选出log相关数据并添加⼀列SumOfLog数据,该数据是将两列Log相加得到,那么我可以这样操作:
BegReaders %>% filter(LogRT:LogFrequency) %>% mutate(SumOfLog = LogRT:LogFrequency)
运⾏后就可以看到,我们的数据增加了新的⼀列,名为SumOfLog,数据是由LogRT和LogFrequency相加得来的。⾃然,你也可以添加
⼀个新的字符串的列,记得使⽤引号将字符引⽤起来即可。