使用Tidyverse完成函数化编程

(参考了家翔学长的笔记)

1.magrittr包的使用

里面有很多的管道函数,,可以减少代码开发时间,提高代码可读性和维护性

1.1 四种pipeline

1.1.1 常用的:%>% 最通俗的嵌套,向右嵌套

6

例子:要求

  1. 取10000个随机数符合正态分布
  2. 求10000个的数的绝对值,同时乘上50
  3. 把结果组成一盒100*100列的方阵

    4.计算方阵中每行的均值,并四舍五入保留整数

    5.把结果除以7求余数,并画出余数的直方图
library(tseries)
library(zoo)
library(lmtest)
library(magrittr)
library(pder)
library(texreg)
library(tidyverse)
library(stargazer)

我的喜好是如果用到哪个包,我基本上会把所有的包,放到一起,放到文档的最前面,但是学长和许良习惯用到哪个,就调用哪个,可能是我太菜了。

set.seed(123)
rnorm(n=10000) %>% abs %>% '*'(50) %>% matrix(ncol=100) %>% rowMeans %>% round %>% '%%' (7) %>% hist

换句话说:

x %>% f(y) 等同于 f(x, y)

y %>% f(x, ., z) 等同于 f(x, y, z)

1.1.2 %T>%

1.取10000个随机数符合正态分布

2.求10000个的数的绝对值,同时乘上50

3.把结果组成一盒100*100列的方阵

4.计算方阵中每行的均值,并四舍五入保留整数

5.把结果除以7求余数,并画出余数的直方图

6.对余数求和

set.seed(123)
rnorm(n=10000) %>% abs %>% '*'(50) %>% matrix(ncol=100) %>% rowMeans %>% round %>% '%%' (7) %T>% hist %>% sum

%T>%向左操作符,其实功能和 %>% 基本是一样的,只不过它是把左边的值做为传递的值,而不是右边的值。这种情况的使用场景也是很多的,比如,你在数据处理的中间过程,需要打印输出或图片输出,这时整个过程就会被中断,用向左操作符,就可以解决这样的问题。

1.1.3 %\(% 解释操作符(exposition pipe-operator)
%\)% 的作用是把左侧数据的属性名传给右侧,让右侧的调用函数直接通过名字,就可以获取左侧的数据。比如,我们获得一个data.frame类型的数据集,通过使用 %$%,在右侧的函数中可以直接使用列名操作数据。

其实就是传递属性名的吧

attach(iris)
iris %>% subset(Sepal.Length>mean(Sepal.Length)) %$% cor(Sepal.Length,Sepal.Width)
[1] 0.3361992

这样子可以省略.$a

1.1.4 %<>%

%<>% 复合赋值操作符(compound assignment pipe-operator)

%<>%复合赋值操作符, 功能与 %>% 基本是一样的,对了一项额外的操作,就是把结果写到左侧对象。比如,我们需要对一个数据集进行排序,那么需要获得排序的结果,用%<>%就是非常方便的。

需要注意一下 %<>% 必须要用在第一个管道的对象处,才能完成赋值的操作,如果不是左侧第一个位置,那么赋值将不起作用。

可以参考博客:https://blog.csdn.net/kmd8d5r/article/details/82881559

写的比较详细

1.1.5

%>%对代码块的传递

iris %>% (
function(x){
if(nrow(x)>2)
bind_rows(x %>% head(1),x %>% tail(1))
else x
}
)

%>%对函数的传递

2 read_*读入数据

2.1 read_*文档

在学长的笔记中指出:Yihui在blogdown包中采用read_utf8{xfun}而非read_file,保证了代码好似utf-8的格式录入,read_utf8虽然不是Tidyverse集成包中的函数,但是很好的处理了编码的问题,我回头要试试

2.2 专业数据描述文档

这里学习read_delim进行阅读,有comment的数据集

car_acc<-read_delim("datasets/road-accidents.csv",delim='|',comment="#")

  1. 这个是表达comment,(对啊,在Rmarkdown中确实是使用一个#来进行注释的)

  2. 使用5个来表达标题

例子略,我还没真正的使用过

3 reprex的使用技巧

reprex存在是为了共享代码??

我以为是为了解决报错之类的,比如安装的包没有及时更新

reprex::reprex(
...
)

把要测试代码写入...

之前写过一个例子,把要测试的函数写入reprex中,可以查看当前安装的包的当前版本信息和历史版本信息

大概是这个样子,会生成一个html文档,代码不记得放到哪个地方了

3.2 数据的引入

head(mtcars) %>% deparse()

deparse()解析表的结构,这个时候再复制粘贴就好 clipr::write_clip()执行

[1] "structure(list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1), cyl = c(6, "

[2] "6, 4, 6, 8, 6), disp = c(160, 160, 108, 258, 360, 225), hp = c(110, "

[3] "110, 93, 110, 175, 105), drat = c(3.9, 3.9, 3.85, 3.08, 3.15, "

[4] "2.76), wt = c(2.62, 2.875, 2.32, 3.215, 3.44, 3.46), qsec = c(16.46, "

[5] "17.02, 18.61, 19.44, 17.02, 20.22), vs = c(0, 0, 1, 1, 0, 1), "

[6] " am = c(1, 1, 1, 0, 0, 0), gear = c(4, 4, 4, 3, 3, 3), carb = c(4, "

[7] " 4, 1, 1, 2, 1)), row.names = c("Mazda RX4", "Mazda RX4 Wag", "

[8] ""Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", "Valiant""

[9] "), class = "data.frame")"

``{r}

head(mtcars) %>% datapasta::tribble_paste()

`tibble::tribble(
~mpg, ~cyl, ~disp, ~hp, ~drat, ~wt, ~qsec, ~vs, ~am, ~gear, ~carb,
21, 6, 160, 110, 3.9, 2.62, 16.46, 0, 1, 4, 4,
21, 6, 160, 110, 3.9, 2.875, 17.02, 0, 1, 4, 4,
22.8, 4, 108, 93, 3.85, 2.32, 18.61, 1, 1, 4, 1,
21.4, 6, 258, 110, 3.08, 3.215, 19.44, 1, 0, 3, 1,
18.7, 8, 360, 175, 3.15, 3.44, 17.02, 0, 0, 3, 2,
18.1, 6, 225, 105, 2.76, 3.46, 20.22, 1, 0, 3, 1
)
datapasta::tribble_paste()直接发生inplace反馈的反馈tibble表格形式
###3.3 其他更多的功能
3.3.1 reprex_invert()=the opposite of reprex()
3.3.2 reprex_clean() when you copy/paste from github or stackoverflow
3.3.3 reprex_rescue() when you are dealing with copy/paste from R Console
3.3.4 reprex::reprex(si=TRUE) add session info in a folding style
###3.4 指定网站发布(学长这个部分我没太懂,回头可以补一下)
3.4.1 “gh” for Github-Flavored Markdown,the default
3.4.2 "so" for StackOverflow Markdown
3.4.3 "ds" for Discourse e..g.community.rstudio.com
###3.5 可复现的例子
需要提前写好代码,想要知道执行后使用者的本地配置
先写好需要的代码
```{r}
library(dplyr)
mtcars %>% dim()
mtcars %>% summary()

然后复制ctrl+c,再执行代码

reprex::reprex(si=TRUE)

此时会生成一个html文件,参考上图

注意下方有一个session info记录了当前的配置,点击后出现

这样就可以知道当前你的系统信息和相关包的安装情况

这个时候如果你的剪贴版没有被覆盖的话,在github的一个对话框中,执行ctrl+v,会发现html代码。。

4 dplyr

4.1 not: ~!

输出所有非数字型的

msleep %>%
select_if(~!is.numeric(.)) %>%
glimpse

Observations: 83

Variables: 5

$ name "Cheetah", "Owl monkey", "Mountain beaver", "Greater short-tailed shrew",...

$ genus "Acinonyx", "Aotus", "Aplodontia", "Blarina", "Bos", "Bradypus", "Callorh...

$ vore "carni", "omni", "herbi", "omni", "herbi", "herbi", "carni", NA, "carni",...

$ order "Carnivora", "Primates", "Rodentia", "Soricomorpha", "Artiodactyla", "Pil...

$ conservation "lc", NA, "nt", "lc", "domesticated", NA, "vu", NA, "domesticated", "lc",...

符号表示:~=function()

     :!=not

4.2 select_*

4.2.1 select_all=rename_all

让名字变为大写
mtcars %>% select_all(toupper) %>% head

让名字变为小写
mtcars %>% select_all(tolower) %>% head

我发现一个问题,我不会编程的原因应该是我不会想问题,我脑子里面没有解决问题的思路,应该多看一些复杂的问题就好了。

R语言函数话学习笔记5的更多相关文章

  1. R语言函数化学习笔记6

    R语言函数化学习笔记 1.apply函数 可以让list或者vector的元素依次执行一遍调用的函数,输出的结果是list格式 2.sapply函数 原理和list一样,但是输出的结果是一个向量的形式 ...

  2. R语言函数化学习笔记3

    R语言函数化学习笔记3 R语言常用的一些命令函数 1.getwd()查看当前R的工作目录 2.setwd()修改当前工作目录 3.str()可以输出指定对象的结构(类型,位置等),同理还有class( ...

  3. R语言函数化学习笔记4

    条件语句和循环语句 当你说话时候用到了如果,此时条件出现了 举个条件函数的例子 sign_t<-function(x){ if(x>0){ return(1) }else if(x< ...

  4. R语言与机器学习学习笔记

    人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自 ...

  5. R语言与显著性检验学习笔记

    R语言与显著性检验学习笔记 一.何为显著性检验 显著性检验的思想十分的简单,就是认为小概率事件不可能发生.虽然概率论中我们一直强调小概率事件必然发生,但显著性检验还是相信了小概率事件在我做的这一次检验 ...

  6. R语言函数化编程笔记2

    R语言函数化编程笔记2 我学过很多的编程语言,可以我写的代码很啰嗦,一定是我太懒了.或许是基础不牢地动山摇 1.为什么要学函数 函数可以简化编程语言,减少重复代码或者说面向对象的作用 2.函数 2.1 ...

  7. R语言函数化编程笔记1

    R语言函数化编程笔记1 notes:有一个不错的网站叫做stack overflow,有问题可以从上面找或者搜索答案,会有大佬相助. 在github上面可以找到很多R的扩展包,如果自己额修改被接受,那 ...

  8. 【数据分析 R语言实战】学习笔记 第十一章 对应分析

    11.2对应分析 在很多情况下,我们所关心的不仅仅是行或列变量本身,而是行变量和列变量的相互关系,这就是因子分析等方法无法解释的了.1970年法国统计学家J.P.Benzenci提出对应分析,也称关联 ...

  9. 【数据分析 R语言实战】学习笔记 第四章 数据的图形描述

    4.1 R绘图概述 以下两个函数,可以分别展示二维,三维图形的示例: >demo(graphics) >demo(persp) R提供了多种绘图相关的命令,可分成三类: 高级绘图命令:在图 ...

随机推荐

  1. Android实战项目——家庭记账本(六)

    今天完成的主要任务如下: 1.设置页功能的布局 2.云服务器的部署 3.成功将一个本地Javaweb项目部署到阿里云 没什么特别说明的,直接上图: 首先是侧边栏功能的布局:               ...

  2. JAVA面向对象 - 方法重载与覆盖

    方法重载 方法重载就是在类的同种实现方式,到底采用哪种方式,取决与调用者给出的参数.方法重载特点是方法名相同,方法的参数类型,个数,顺序至少有一项不同,方法返回类型可以不同,方法的修饰符可以不同,只是 ...

  3. Windows通过DOS命令行设置IP地址

    @rem 设置固定IP地址netsh interface ip set address "本地连接" static 192.168.1.200 255.255.255.0 192. ...

  4. maven第一次创建项目太慢解决方法

    问题: 第一次用maven创建项目的时候,因为本地仓库中没有jar包,需要从中央仓库下载,所以会比较慢 解决方法: 因为从中央仓库下载默认使用的国外的镜像下载,速度比较慢,我们可以把镜像修改为从阿里云 ...

  5. mysql第五课

    修改表中一行或多行数据: SELECT*FROM student;+----+------+------+| id | name | ban  |+----+------+------+|  1 | ...

  6. SCPI指令闲扯

    准备用SCPI控制我的汉泰DSO3254示波器,实现如下的功能. 一通道采集数据,二通道作为触发,每触发一次,传输一和二通道采集到数据到电脑. 我以为可以如下设计:电脑发出指令,示波器电脑进入挂起状态 ...

  7. phpcms抛出的二维数组转移到js,js中for....in遍历数组,用“.”连接来读出一维数组值

    直切正题: 1.phpcms在模版中读出数组有很多中方法,如,{pc:content action="lists"}或{pc:get sql=""},经过{lo ...

  8. PHP0007:PHP基础-字符串

    php设置编码 用gbk编码识别utf8字符

  9. ECMAScript基本对象——Date日期对象

    1.创建 var 对象名 = new Date(); 2.方法 ①toLocaleString()据本地时间格式,把 Date 对象转换为字符串.和电脑的语言位置有关 ②getTime()返回 197 ...

  10. Spark学习之路 (十九)SparkSQL的自定义函数UDF[转]

    在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等 UDAF( ...