当前位置:首页 > 教育

r怎么写 如何使用管道操作符优雅的书写R语言代码

杜宇,EasyCharts团队成员,R语言中文社区专栏作家,对Excel商务图、R语言数据可视化、地理信息数据可视化有兴趣。个人微信官方账号:“数据立方”创始人:数据立方(微信ID: datamofang)。

在本文中,我们将与您分享如何使用R语言中的管道运算符优化代码,以及如何调用和传递管道函数的参数。

使用R语言处理数据或分析时,不可避免地要编写连续的输入输出代码。按照传统的编写方法或者习惯,初学者往往会引入大量的中间变量,或者使用函数嵌套进行一次性输出。

虽然以上两种方法在结果方面都能达到我们预期的效果,但是无论是代码效率还是内存占用都有巨大的劣势。

1.使用中介变量会增加内存开销。特别是你的原始数据非常大,内存有限。在一个进程中引入过多的中介对象,不仅会使代码冗余,还会很快透支内存。

2.使用函数嵌套避免了内存占用的问题,但是嵌套过多的函数层会使代码难以理解和阅读,甚至会给以后的项目复用带来很大的麻烦。

而R语言的领导者很早就意识到了这个问题,开始在R语言中引入流水线操作符函数不断传递参数,从而实现了内存节省和代码优化的要求。

通常使用最多的管道函数来自magrittr包,其中管道操作函数写成% >: %,是R语言中常用的函数,很多成熟的项目扩展包都有内置的管道操作函数。(例如,dplyr、rvest、传单等。都实现了默认调用)。

流水线操作符用于大多数扩展包函数,默认情况下不加载magrittr包,在使用函数之前需要加载包。

这里我们从一个小案例开始今天的解释:

库(“服务器”)

库(“stringr”)

url<。-" http://www.zyzw.com/twzs010.htm"

在最近一个关于中国世界文化遗产仪表板的案例中,我在目标网站上抓取了52个中国世界自然文化遗产的名称。

根据引入中间变量的传统方式,代码应该如下所示:

web<。-read_html(url,encoding = " GBK ")web 1 & lt;-html_nodes(web,“b”)内容& lt-html_text(web1,trim = FALSE)内容& lt-gsub("(nt|,|d|,","",content 1)content 3 & lt;-grep("S ",content2,value = T)content 4 & lt;-str_trim(content3,side="both")content5<。-content 4[1:54]content 6 & lt;-content5[setdiff(1:54,c(35,39))];内容6

其实在参数传递的细节上有很多需要注意的地方:

1.当函数只需要一个必要参数时,函数的写入容差非常高,相对自由:

样本(字母[1:5],大小=20,替换=真)% & gt% table()示例(字母[1:5],大小=20,replace = TRUE)% gt;% tablesample(字母[1:5],大小=20,replace = TRUE)% gt;% table(。)a b c d 5 7 1 7

以上三种写法都能输出正确的结果。第一种写法保留圆括号,第二种写法省略圆括号,第三种写法保留圆括号和占位符“.”。

由于table只接受一个位置参数(你也可以理解为必选参数,是一个因子或者类别变量),管道操作者从左侧传入的参数会被认为是table的必选参数。

前两种写法是等价的,第三种写法在括号里加了占位符,后面会讲到。

2.当函数有一个以上的必要参数(位置参数),并且管道函数传入的参数位于第一个时,可以用以下方式编写:

url %>;% read _ html(encoding = " GBK ")URL % & gt;% read_html(。,编码=“GBK”)

read_html函数中只有一个位置参数x(必选参数),编码是默认参数,options也是默认可选参数。所以x是强制参数,不需要声明参数名。Url是% >: %传入read_html,默认被视为x参数的对象。以上两种编写方法是等价的,第二种在read_html()函数中声明x参数的位置。(相当于x参数的占位符),但在这种情况下没有必要。(因为X是第一个位置参数,所以默认可以识别。)

3.当函数有多个位置参数(强制参数),并且从左侧传入的对象在右侧函数中没有排在第一位时,这种情况下,参数在右侧函数中的位置必须显式声明,并且" "应该用作占位符。

read_html(url,encoding="GBK") % >% html_nodes("b") %>。% html _ text(trim = FALSE)% & gt;% gsub("(nt|,|d|,"," ")read_html(url,encoding = " GBK ")% & gt;% html_nodes("b") %>。% html _ text(trim = FALSE)% & gt;% gsub("(nt|,|d|,",",")read_html(url,encoding="GBK") % >;% html_nodes("b") %>。% html _ text(trim = FALSE)% & gt;% gsub("(nt|,|d|,",","。)

在上面的代码中,前两个是错误的,最后一个成功了,因为gsub函数有三个位置参数(强制参数),我们从左侧传入的string对象正好在第三个位置参数的位置。如果没有明确声明,告诉gsub函数% >: %传入对象在右侧函数中左侧的具体位置,函数无法自动识别。

gsub(pattern,replacement,x,ignore.case = FALSE,perl = FALSE,fixed = FALSE,useBytes = FALSE)

以上三点是基于函数式编程中传递位置参数必须遵循的规则,实际上是符合现实逻辑的。通过以上三点,我们可以得出结论:

1.右侧的函数只有一个位置参数(当它是必要参数时)。可以只写函数名(不带括号),也可以用双括号写函数名,也可以写函数名+(。).以上删除照片的方法是合法的,但后两种不是必须的,功能可以根据逻辑自动识别。

2.当右函数有多个位置参数时,取决于右位置参数中从左侧导入的参数的顺序。如果恰好是右侧所有位置参数中的第一个,写的比较灵活,可以直接忽略。仅指定其他位置参数和默认参数。如果它位于第一个位置之后,则必须给出一个准确的显式位置声明和一个占位符。应该使用。

此外,当管道函数传递参数时,它还支持传递给数据帧的切片索引操作。如下图所示:

read_html(url,encoding="GBK") % >% html_nodes("b") %>。% html _ text(trim = FALSE)% & gt;% gsub("(nt|,|d|,",","。)% & gt% grep("S ",)。,值=T) % >;% str_trim(side="both") %>。% .[1:54]

在最后一次参数传递过程中,一个文本向量被传递到左侧,它可以像普通场景中的向量下标索引一样过滤观察值。此时,左向量的名称可以由占位符代替,而不是写出(。在这里是必要的)。

Magrittr包提供了很多类似的% >以保证管道功能参数传输过程更加高效。%的辅助功能:

函数名:函数符号表达式:extract `[` extract 2 `[` insert `[

以上功能包括四个操作,逻辑判断比较功能,包含关系功能等。,以及一些不常用的冷门函数。我只拿几个常见的来简单介绍一下。

库(“马格里特”)

提取函数相当于`[`,用于索引数据框中的列:

iris %>。% extract(,1:3) % >% headiris %>。% `[`(1:3) % >% headiris %>。% .[,1:3] % >% head

以上三种方法对虹膜前三列进行索引和预览,结果是等价的。

extract2函数相当于`[ `,用于索引列表中的顺序对象。

mydata<。-list( mmm=1:5,nn=c("dd "," fff "," ttt "),dd=6:20 )mydata % >% extract2(1)mydata % >% `[[`(1)mydata[[1]]mydata$mmm

1 2 3 4 5

以上四种标引方法是等价的。

好时光& lt-Sys。date()% & gt;% as。POSIXct %>。% seq(by="15分钟",length . out = 100)% & gt;% data.frame(时间戳=。)good.times $ quarter & lt-good . times % & gt;% use _ series(timestamp)% & gt;%格式(" % M ")% & gt;% as.numeric %>。% divide _ by _ int(15)% & gt;% add(1)good . times $ quarter & lt;-good . times % & gt;% .[,"时间戳"]% & gt;%格式(" % M ")% & gt;% as.numeric %>。% `%/% `(15)% & gt;% `+`(1)[1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 [61] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4

以上两种方法的输出结果是等价的,特别注意最后% >: % `%/%`(15)函数,% >;% `+`(1),前者表示左边传入值的商除以15的整数部分,后者表示向量均匀增加1。

加`+`减`-`乘` * `升_到_幂`^`multiply_by_matrix `%*% `除_乘`/`除_乘_int `%/% `模` %% '

以上是浓缩的简单几何运算,可以通过函数名或符号表达式与% >结合。%传递参数,保存代码,提高效率。

至于其他尚未解释的特殊用途,如果您感兴趣,可以参考源代码文档。

本文参考文献:

https://cosx.org/2014/04/use-pipeline-operators-in-r

http://blog.fens.me/r-magrittr/

https://cran . r-project . org/web/packages/magritter/magritter . pdf

关于过去的案例数据,请转到我的GitHub:

https://github.com/ljtyduyu/DataWarehouse/tree/master/File

1.《r怎么写 如何使用管道操作符优雅的书写R语言代码》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《r怎么写 如何使用管道操作符优雅的书写R语言代码》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/jiaoyu/823137.html

上一篇

通惠陵园 清明祭扫预约超8万 京郊陵园实行单向出入祭扫从简

下一篇

国家一级响应 上海:将一级响应调整为二级响应

芳草地西街 芳草地一居民楼主管道堵塞 居民厨房“水漫金山”

2014年10月25日,北京芳草地西街9号楼为旧住宅楼。由于主管道堵塞,2单元二楼某住户家的厨房不断上涨,而一楼住户家不仅水溢出,还下到天花板上。最难的是取水问题没有解决,因为找不到产权单位。昨天下午,记者来到204房间,厨房正在打水。79岁的戴太太正忙着给儿子倒水...

广东白云学院地址 你所不知道广州第二大学城,有多少所高校入驻?地理位置在哪?

  • 广东白云学院地址 你所不知道广州第二大学城,有多少所高校入驻?地理位置在哪?
  • 广东白云学院地址 你所不知道广州第二大学城,有多少所高校入驻?地理位置在哪?
  • 广东白云学院地址 你所不知道广州第二大学城,有多少所高校入驻?地理位置在哪?
正态分布的概率密度函数 关于正态分布,你不知道它诞生之路是多么“变态”

正态分布的概率密度函数 关于正态分布,你不知道它诞生之路是多么“变态”

本文来自微信官方账号:超级数学建模 微信号:超模 上帝说,一定有正态分布 所以有一个正态分布 正态分布,相信所有模特朋友都很熟悉。不过超模君对比课本,想说说。。。  拉普拉斯作为概率论大牛,说过既然来了就不会轻易离开。于是,他开始研究人们一直在疑惑的随机误差(这是当...

大椎穴位位置图 身上重要的22个穴位图全部都在这里

  • 大椎穴位位置图 身上重要的22个穴位图全部都在这里
  • 大椎穴位位置图 身上重要的22个穴位图全部都在这里
  • 大椎穴位位置图 身上重要的22个穴位图全部都在这里

人体内脏器官结构位置分图布详解

从上到下,人体内脏器官主要包括甲状腺、气管、上主动脉、上腔静脉、心脏、肺、食道、隔膜、肝脏、下腔静脉、下主动脉、胆囊、脾、胃、肾、胰腺、小肠、大肠、输尿管、阑尾、膀胱、直肠、尿道。人体内脏分布图人体内脏分布图的彩色图后腹壁图腹部内脏-图腹部网膜人体内脏常见疾病内脏泌...

女人g点在什么位置图解 抠弄g点速度如何掌握?

女人g点在什么位置图解 抠弄g点速度如何掌握?

女的g点哪里有图解,如何把握g点的速度?女人可以说是爱和恨私密的地方。如果在私密的地方出现“脾气”的症状,真的很麻烦,不好说;相反,当两个同类做爱时,女性的隐私会有一些敏感区,可以让女性享受性快感。其中,值得探究的神秘“G”点是三天两夜完成不了。妇产科医生说,有些女...

压力管道 压力管道类别与级别

一、ANSI/ASME B31.3中输送流体的分类 美国国家标准ASME压力管道规范ANSI/ASME B31.3(以下简称B31.3)将化工厂和炼油厂管道输送的流体分为D类、M类和III类流体,其性质介于三者之间。 d类流体在运行条件下不易燃、无毒、对人体无害;设...

孕脉位置图 成都老中医应战诊脉验孕首轮猜错

自从网络红人@烧伤超人阿宝向中医发起挑战后,成都老中医艺鹭主动接受挑战,抛出20万元,希望在癌症、肿瘤等诸多方面与对方交锋。陆过来检查五个女人的脉搏,直到第二轮他才猜到是哪个怀孕了。即便如此,他表示会继续挑战。早前报道成都老中医愿出20万应战诊脉验孕 称肯定不会输华...