Advertisement

r语言psych包_R语言 | Tidyverse包入门介绍

阅读量:

R语言

语言学与R语言的碰撞

Xu & Yang

PhoneticSan
67e1d232f876fc27a8e1af1688f4962e.png

学习参考

Discovering Statistics Using R

Statistics for Linguistics with R

How to Do Linguistics with R

R in Action

Analyzing Linguistic Data

R Graphics Cookbook

··· ···
7d8e3a05db98dc6c6ccd0395aba3f9d8.png

R: The R Project for Statistical Computing

https://www.r-project.org/

RStudio:

https://rstudio.com/

在语言学本科专业逐渐兴起的时代,R已经逐渐成为语言学学生所需掌握的必备技能之一。事到如今,依旧有“数据处理,Python和R到底学哪个”的争辩。今天,我们讲一个“让R能够和Python在数据处理方面一较高下”的扩展包:tidyverse 包。本期将介绍以下函数运算:

%>%, tibble, as_tibble, read_csv, read_delim, filter, select, mutate, group_by, summarise, gather, spread
d0b1f8b997bf608970598eb923f1f33b.png

数据处理流程 (R for Data Science , pp. ix)

迄今为止,我们的R语言入门级讲解,都会对已有的数据进行预处理,得出漂亮的可视化结果。这些处理都是在base R上得到的,你可以理解为R内置的自带函数,比如plot、data.frame等函数。然而,这些函数在进行大量数据处理的时候,不仅处理繁琐,而且语句会显得冗长,可读性较差,降低了数据处理的效率。以此为契机,统计学家Hadley Wickham开发出了一系列数据处理的包,整合成为一个,这就是tidyverse 包,它里面包括了与数据处理相关的内容,如ggplot2,dplyr,tidyr,tibble等等。你可以直接调用tidyverse,也可以调用它所辖属的包。下面,我们讲解一些tidyverse中可能使用到的函数,帮助你快速上手这个方便的东西。同时,我们会比较tidyverse和base R之间的不同之处,帮助你更快理解,为什么tidyverse受到更多的推崇。

数据导入:tibble

如果已经学过R的一些基础教程,或者你读过** R in Action** 这本教材,就会发现,导入到R的语言学数据,都会成为一个data.frame结构的数据,因为它往往包含多个变量。然而,这种导入往往会莫名地更改一些数据的原本格式。有时我们更需要原来的格式,该如何设置?tidyverse下的tibble 包帮助我们实现了这一想法。如果你直接调用了tidyverse,那么不需要额外再调用tibble。
a951f9d36fd927de53d25a0e139f3d23.png

tidyverse包的内容

tibble是升级版的data.frame格式,它可以保持数据原本的格式,此外,它不会再把放不下的数据多行多列显示,而是以总结形式显示够你的屏幕即可。以languageR包中beginningReaders的数据为例,一共有13列数据,如果是base R,直接调用会发现,到第9列时已经占不下,它会自动换下一行继续显示,显得十分冗长。如果转换为tibble格式,它会最多显示8列,剩余的内容以解读的形式展现,在每个标头下会显示该列数据格式,如int表示整数型数据,fct表示factor。tibble使得该数据的格式和结构一目了然。
336de124c653061176329395c79ed6aa.png

tibble格式下的数据显示

除了创建tibble,以及将已有的格式转变为tibble外,在导入时,我们也可以将数据直接以tibble格式导入。在之前base R中,我们使用的函数为read.table等,相应的,tidyverse包中也有相关函数,且运行速度要比base R中的快。以csv格式为例,使用read_csv 即可,内部结构与base R的函数一致。更一般的,如果读取制表分隔符的文本数据,使用read_delim 函数,记得添加一句delim='\t'即可。
bb289be3a62f4da3ce6b9e82557857db.png

使用read_delim导入制表分隔符文本数据

下面我们将tibble包中主要使用的函数总结,你可以根据相关代码进行体验:

复制代码
    library(languageR)# 加载tidyverselibrary(tidyverse)# 创建tibble格式数据a b my_tibble # 将已有数据转变为tibble格式BegReaders # 导入数据时直接以tibble格式导入my_data my_data my_data

数据整理:dplyr/tidyr

tidyverse所包含的dplyr包中,囊括了众多数据处理的函数,包括filter、select、mutate、summarise等。在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数据是在重复使用,并没有体验到与base R有差别的地方。下面,我们介绍tidyverse中最重要的函数之一:管道运算**% >%**,是它将代码变得简洁易懂。通俗解释,将运算符左侧的内容应用到右边的内容去。如上面verbs的处理,我们可以这样使用:

复制代码
    verbs %>% as_tibble() %>%  filter(LengthOfTheme > 2) %>%  ggplot(aes(RealizationOfRec, LengthOfTheme, color=AnimacyOfRec)) + geom_point()

用语言解释一下即:将verbs数据应用到as_tibble中转换为tibble格式,然后筛选转变后的数据,最后将筛选出来的数据绘图。%>%的存在让整个代码显得简洁高效,可读性也大大提高。
d0a012424d8fd6242d0816f15e211d49.png

第二个select 函数可以选择特定的一列或多列数据。与filter不同,filter可以筛选出行的数据,而select则是筛选出列的数据。以verbs为例,具体代码和运行效果如下:

复制代码
    # 筛选出一列select(verbs, Verb)# 筛选出多列select(verbs, Verb, LengthOfTheme)select(verbs, Verb:LengthOfTheme)# 筛选出除特定列外的其他列select(verbs, -Verb)
f97ca5569b4d8b0907af67ce1ac447e0.png

如果想要改变tibble中的数据,或者增加变量,那么你可以使用mutate 函数,它的主要功用是增加一列新的数据变量,并与已有数据对应起来。以beginningReaders数据为例,上面我们已经转换为tibble格式了,存到了BegReaders变量中。我想筛选出log相关数据并添加一列SumOfLog数据,该数据是将两列Log相加得到,那么我可以这样操作:

复制代码
    BegReaders %>%   filter(LogRT:LogFrequency) %>%   mutate(SumOfLog = LogRT:LogFrequency)

运行后就可以看到,我们的数据增加了新的一列,名为SumOfLog,数据是由LogRT和LogFrequency相加得来的。自然,你也可以添加一个新的字符串的列,记得使用引号将字符引用起来即可。
7110be17666ccbf64018e01b9527c4c6.png

对于统计数据而言,summarise 函数,可以很好地计算相关列的数据统计结果。这个函数往往会和group_by 函数一起使用。以beginningReaders数据为例,如果在base R中想求出不同的词汇在LogRT上的平均值,那我们就得使用100多次$运算符进行计算:

复制代码
    mean(BegReaders$LogRT[BegReaders$Word == 'avontuur'])mean(BegReaders$LogRT[BegReaders$Word == 'baden'])# ...

在tidyverse中,我们可以使用summarise函数结合gourp_by快速完成相关的计算,并返回一个tibble格式的数据,不用我们再进行重组,具体代码如下所示。summarise函数也可以用来计算标准差等数据。

复制代码
    BegReaders %>%   group_by(Word) %>%  summarise(average=mean(LogRT))
f1734eb03bf075581e80d610e512405e.png

最后,我们介绍tidyr包中的gatherspread 两个函数。reshape2包中有melt函数,可以帮助我们进行数据整理,把宽数据转变为适合ggplot的长数据类型(即一行只对应一个数据)。tidyr中的这两个函数也是这种功能,但是要比reshape更高效且更方便。gather函数可以把宽数据转变为长数据。以我们自己的数据为例,它的宽数据表现如下图所示。
93b76ef8d5f450f985c7dd3760c6109b.png

为了让大家更直观地感受两个函数的不同之处,我们分别进行数据格式转换,具体代码如下:

复制代码
    # reshape2包中的melt函数data data.melt data, id=c(data.melt$TonalCategory $variabledata.melt$DurationRatio $value# tidyverse包中的gather函数data_2 '\t')data_2_re

这两种函数都将宽数据转变为了长数据,但是很明显,base R的操作要更加繁琐,而tidyverse使用了管道函数后,整个代码变得十分简洁。gather函数的主要构成是:gather(data, variable, value, range) 。variable和value是设定好标头名称,这里我们分别命名为TonalCategory和DurationRatio。运行后也可以看到,gather函数下的数据更为简洁明了。
11b8369ae88228e63cb0ad4d290f0cea.png 8369192a38c1e5759b7f98bd79139d8e.png

spread 函数则正与gather函数相反,它是将长数据转变为宽数据。比如我们将data_2_re转为宽数据:

复制代码
    data_3 <- data_2_re %>%  spread(TonalCategory, DurationRatio)
97899f379009b36ee8943db2077fa0ce.png

今天这期主要介绍了tidyverse包中一些最基本的操作。相较于Base R,它的确更加高效和简洁,同时学习成本也并不高。之后有机会我们会继续介绍相关数据操作的内容。此外,在Rstudio官网中有相关的cheatsheet,其中有一份比较了base R和Tidyverse语法的不同之处,如下图所示。除此之外,还有很多其他的简介版cheatsheet。点击
c767aacdbb22bc8e7ffa48928d577324.png ae448a67a1e857560ef5b8684fa5e811.png

—END—

排版:Xu & Yang
072cd2bb99e7097f4a01e7ab116507ef.png

全部评论 (0)

还没有任何评论哟~