【R语言数据分析】函数

目录

自定义函数

apply函数

分类汇总函数aggregate


自定义函数

R语言中的自定义函数更像是在自定义一种运算规则。

自定义函数的语法是

函数名

函数体

}

比如

表示定义了一个名为BMI_function的函数,这个函数代表了一种运算规则,就是把传入的x和y进行x/((y/100)^2)的操作。然后把体重与身高作为实参并把运行结果产生的向量作为新的一列加到原来的数据框中。R语言中return并不是刚需。

本次代码中自定义的函数只能在本次代码中使用,如果我们想要在其他工程中使用这次写的函数,可以把本次定义函数的代码复制下来保存到一个txt格式的文档里,在开启一个新工程的时候我们就可以使用source函数,source() 函数用于读取并执行一个R脚本文件中的代码。当你在R环境中运行source()函数时,它会将指定脚本中的代码逐行读取并执行,就像你在R控制台中手动输入并执行这些代码一样。source函数只接收一个参数,就是想要让他读取的R代码的路径。

再举个例子,有这样一个表格,这个表格用数据框mydata存储

我想要看看整体的人际关系评估,展示形式是所有人人际关系得分的平均值±所有人人际关系得分的标准差,自定义的函数如下

这是一个针对单个向量的函数,round(mean(x),2)表示对向量x的平均值保留两位小数,paste函数用于把x的均值和标准差连接起来,连接符号为±

如图是我们把数据框mydata的某一列作为参数时候的运行结果

我们当然也可以直接使用循环来得到mydata每一列这个向量的运算结果

其中mydata[i]表示提取数据框的第i个元素,也就是第i列的向量

可以写成mydata[,i],表示提取第i列所有行的元素。但是这样难免造成一些理解上的困扰,这两种写法就好比我买糖,第一种是老板用一个袋子把糖装起来给我,第二种写法是老板直接抓了一把糖给我,至于我能不能接受就要看我的脾气好坏了,回到这个代码,至于R能不能识别,就要看R的兼容能力了。不过测试来看R是可以理解这种写法的。实际上我们通过all(mydata[2]==mydata[,2])这句代码的运行结果为TRUE可以知道这两个向量是完全一样的。

注:比较两个向量(假设是x和y)是否相等的方法:如果是比较两个向量每个位置上的元素是否相等,可以直接使用x==y,这样会返回很多结果,如果单纯想要比较两个向量是否相等,可以搭配函数all,例如all(x==y),如果两个向量的比较结果中所有元素都是TRUE,则返回TRUE。

如果想要把这个for循环的结果存储起来,应该先找一个空盒子,也就是代码中的ret,然后使用rbind函数按行合并即可。这里我们在每次合并的时候还把每一列的名字加了进去,以便于清楚地看到反映的是哪一列的整体水平。

但是这样的运行结果是产生了一个向量,这个向量的内容是列名与均值标准差函数的运行结果相间的,我们如何把这个向量分成两列?思路就是把名字和函数运行结果分别提取出来存到两个向量(比如x和y)里面,然后再使用data.frame(x,y)就可以了,首先是提取列名,因为使用的就是列表中三到九列的名字,因此x

apply函数

apply函数族比较常用的函数有apply,lapply,sapply,vapply,mapply等。

重点来介绍一下apply函数,语法为apply(数据集,行/列,计算规则),第一个参数指定要操作的数据集,一般是数据框或者矩阵,第二个参数指定是按照行为单位进行运算,如果该参数为1则表示按照行进行运算,该参数为2则表示按照列进行运算。第三个参数指定运算的规则,本质上这个参数是一个函数,因此实际上我们在对apply函数传参的时候第三个参数通常是传的函数名,但是要求这个函数必须是针对单一向量进行运算的。整个一句代码的意思是数据框或者矩阵中的所有行(或者列)都按照指定的运算规则来运算,所以调用一次apply函数就相当于调用了一次循环。实际上apply函数能做的事情使用for循环都可以解决,但是apply胜在语法简洁,而对于一些比较复杂的逻辑,还是推荐使用for循环。

比如有这样一个名为mydata2的数据框

我想要对后四列求一个均值来观察这几个向量整体的水平。则可以运行代码apply(mydata2[5:8],2,mean),其中mydata2[5:8]表示提取5到8列,2表示按列进行运算,mean表示对每一列进行的运算都是求均值。运行结果如图

使用for循环的话就业这样写

运行结果如下

注:在求均值的时候mean函数的参数传的是mydata2[,i],这表示第i列所有的元素,每个元素都是一个数值型的,如果我们传mydata2[i],表示拿到数据框mydata2的第i个元素,也就是他的第i列,这仍然是一个数据框,只不过这个数据框只有一列罢了,而mean函数的参数要求必须是数值型或者逻辑型。因此要注意函数参数需要的是一列,还是这一列的每个元素。

我们还想用均值±标准差的形式展示后四列的整体状况,可以这样写

其中均值标准差函数使我们自定义的,apply中mydata2[,5:8]表示提取mydata2这个数据框5到8列的所有元素,对拿到的每一列都进行均值标准差函数的运算,运行结果如图

我们使用ret把这个结果存储起来并查看他的类型,发现是字符型,为了方便后续的操作,我们把它转换成具有表格形式的类型也就是数据框或者矩阵,这里是转换成了数据框,最后把转换完成之后的ret结果保存起来写出到当前目录中去。

我们现在又想要观察mydata2这个数据框的5到8列整体的概况,那就可以写成

但是class(ret)结果显示ret的类型是一个列表,列表这种类型属于是对后续的操作非常不友好,ret的内容如图

没有表格,就像是一个清单一样,没法复制到excel进行后续操作,因此我们现在要把这个列表转换成数据框,从而方便操作,前面我们介绍过类似的例子,列表转数据框,如果直接使用as.data.frame,将会得到一个这样的数据框

这个数据框有1行,20列,这仍然不符合后续分析的格式。

将列表转换成数据框常用的方法是do.call函数,但是并不是说do.call函数是用来专门把列表转换成数据框类型的。do.call根据一个名称或函数以及要传递给它的参数列表构造并执行一个函数调用。

ret长这样子

本来的ret是一个列表,列表的内容如下

do.call函数会把ret这个列表的元素作为rbind函数的参数并调用rbind。列表的每一个元素仍然是列表类型,这一点可以通过class函数验证。列表中每个元素都有名字,这些名字被当做了合并后的数据框的行名。

刚才对于apply的应用都是按照列来的,再来介绍一个按照行来应用的例子。

有这样一个名为mydata1的数据框

里面的内容是根据这样的一个量表得到的

但是有几个反向计分题,需要先进行逆向化处理以确保每一类的题目得分都是同一方向的。由于存在多个需要处理的题目,所以我们干脆写一个逆向化处理的函数以避免后续代码的冗余。需要处理的题目分别在mydata1的第7,9,13列,准备工作可以通过这段代码来完成

首先自定义了一个函数re,则个函数的功能是让x向量里面的1变成5,2变成4等等,中间用分号连接且需要用引号括起来。之后使用apply把mydata1的7,9,13列作为参数调用re,这样调用完apply函数之后7,9,13列的逆向化处理就做完了,同时返回一个数据框,这个数据框就是逆向化之后的这三列,我们使用ret接收这个数据框,并把这个数据框的列名修改掉,最后合并到mydata1这个数据框中去。这样准备工作就做完了,我们开始想要求这些学生某一类问题的平均得分,比如计算一号学生继续承诺的平均得分,就需要把继续承诺这类问题中对应的题号下得分加起来求平均值,这显然是一个按行处理的方法,因此运行代码

apply(mydata1[,c(4,29,30,12,20,25)],1,mean)即可得到每个学生继续承诺这类问题的平均得分。其中第一个参数是这一类问题的题号对应的列,第二个参数是1表示按照行处理,第三个参数是mean表示要对每一行这些列的元素求平均值。

分类汇总函数aggregate

有这样一个名为mydata的数据框

现在要求出除了性别和是否患病的其他列的平均值,代码为

apply(mydata[,c(2,4:14)],2,mean)

结果如图

但是如果我们想要根据性别分别统计这些数据,就要使用aggregate函数了。

语法为aggregate(x=list(数据框),by=list(分组向量),FUN=函数名),aggregate函数无法指定按照行还是按照列来进行操作,这个函数只能以列进行运算。

运行代码

aggregate(x=list(mydata[,c(2,4:14)]),by=list(mydata$性别),FUN=mean)

结果如图

也可以通过代谢综合征进行分类,代码为

aggregate(x=list(mydata[,c(2,4:14)]),

by=list(mydata$代谢综合征),FUN=mean)

结果如图

还可以通过性别和是否有代谢综合征这两个标准进行分类,代码为

aggregate(x=list(mydata[,c(2,4:14)]),

by=list(mydata$代谢综合征,mydata$性别),FUN=mean)

只需要在by这个参数中把两个分类标准都加进去就行。

aggregate中的FUN参数还可以是自定义的函数名,比如

运行结果为

有时候样本不遵循正态分布,需要用中位数(下四分位点~上四分位点)这样的格式来统计数据。这时候我们就这样写

运行结果如图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测算法YOLOv3简介

YOLOv3由Joseph Redmon等人于2018年提出,论文名为:《YOLOv3: An Incremental Improvement》,论文见:https://arxiv.org/pdf/1804.02767.pdf ,项目网页:https://pjreddie.com/darknet/yolo/ 。YOLOv3是对YOL…

Node.js -- express 框架

文章目录 1. express 使用2. 路由2.1 路由的使用2.2 获取请求报文参数2.3 获取路由参数2.4 路由参数练习 3. express 响应设置4. 中间件4.1 全局中间件4.2 路由中间件4.3 静态资源中间件 5. 获取请求体数据 body-parser6. 防盗链7. 路由模块化8. 模板引擎8.1 了解EJS8.2 列表渲…

【C++】深入理解string类

一、熟悉string类 1.1 string类的由来: C语音中的字符串需要我们自己管理底层空间,容易内存泄露。而C是面向对象语音,所以它把字符串封装成一个string类。 C中对于string的定义为:typedef basic_string string; 也就是说C中的str…

java面试(微服务)

SpringCloud五大组件 Nacos:注册中心Ribbon:负载均衡Feign:远程调用sentinel:服务熔断Gateway:网关 注册中心 Eureka Nacos 负载均衡 Ribbon负载均衡流程 Ribbon的负载均衡策略 RoundRobinRule:简单的…

C++中把Lambda 表达式作为参数传递给模板函数。

例子&#xff1a; template<class fun> void mytest(fun f) {_string s1 "abc";_string s2 "abc";if (f(s1, s2)){std::cout << "相等。\n";}}int main() {mytest([](const _string s1, const _string& s2) { return s1 s2; …

python学习笔记----异常、模块与包(九)

一、异常 1.1 什么是异常 在Python中&#xff0c;异常是程序执行时发生的错误。当Python检测到一个错误时&#xff0c;它会引发一个异常&#xff0c;这可能是由于多种原因&#xff0c;如尝试除以零、访问不存在的文件&#xff0c;或者尝试从列表中获取不存在的索引等。异常处…

数组的拷贝

数组的拷贝 文章目录 数组的拷贝浅拷贝内存分析 深拷贝内存分析 浅拷贝 概念&#xff1a;数组的浅拷贝是指新数组保存的是原数组的内存地址&#xff0c;并没有拷贝真正的值&#xff0c;如果原数组的内容发生改变那么新数组的内容也会发生相应改变。 代码实现&#xff1a; pu…

C语言/数据结构——每日一题(合并两个有序链表)

一.前言 嗨嗨嗨&#xff0c;大家好久不见&#xff01;今天我在LeetCode看到了一道单链表题&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists想着和大家分享一下&#xff0c;废话不多说&#xff0c;让我们开始今天的题目分享吧。 二.正文 1.1题目描述 1.2题…

phpstudy 搭建 upload-labs 文件上传靶场

phpstudy 搭建靶场&#xff1a;下载安装好phpstudy后&#xff0c;下载靶场源码&#xff1a; upload-labs下载地址&#xff1a; https://github.com/c0ny1/upload-labs 下载完压缩文件&#xff0c;解压文件&#xff0c;解压后的文件夹命名为upload--labs 将解压后到文件夹放…

docker如何生成springboot镜像

1、在springboot的jar包所在的目录下创建Dockerfile文件&#xff0c;此案例的目录为/usr/java Dockerfile的文件内容如下&#xff1a; FROM openjdk:8 LABEL author"zengyanhui" LABEL email"1181159889qq.com" WORKDIR /usr/java/springbootdemo COPY s…

负债56亿,购买理财产品遭违约,操纵虚假粉丝,流量在下滑,客户数量减少,汽车之家面临大量风险(六)

本文由猛兽财经历时5个多月完成。猛兽财经将通过以下二十二个章节、8万字以上的内容来全面、深度的分析汽车之家这家公司。 由于篇幅限制&#xff0c;全文分为&#xff08;一&#xff09;到&#xff08;十&#xff09;篇发布。 本文为全文的第十四章、第十五章、第十六章。 目…

机器人系统ros2-开发实践04-ROS 2 启动文件管理大型项目的最佳实践

机器人上的大型应用通常涉及多个互连的节点&#xff0c;每个节点可以有许多参数。海龟模拟器中模拟多只海龟就是一个很好的例子。海龟模拟由多个海龟节点、世界配置以及 TF 广播器和监听器节点组成。在所有节点之间&#xff0c;存在大量影响这些节点的行为和外观的 ROS 参数。 …

《与 Apollo 共创生态——Apollo7周年大会干货分享》

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 阿波罗X企业自动驾驶解决方案自动驾驶技术提升与挑战自动驾驶系统功能与性能的详细解析<td alig…

python可视化学习笔记折线图问题-起始点问题

问题描述&#xff1a; 起始点的位置不对 from pyecharts.charts import Line import pyecharts.options as opts # 示例数据 x_data [1,2,3,4,5] y_data [1, 2, 3, 4, 5] # 创建 Line 图表 line Line() line.add_xaxis(x_data) line.add_yaxis("test", y_data) li…

数字阅览室的优势

近年来&#xff0c;随着我国社会经济的快速发展&#xff0c;信息技术的发展也得到了广泛的应用&#xff0c;我国高校图书馆和图书管理系统进入了快速发展的快车道。在这种环境下&#xff0c;数字化阅览室在校园中非常流行。数字阅览室是一套真正意义上的面向中小学图书管理、浏…

Golang | Leetcode Golang题解之第58题最后一个单词的长度

题目&#xff1a; 题解&#xff1a; func lengthOfLastWord(s string) (ans int) {index : len(s) - 1for s[index] {index--}for index > 0 && s[index] ! {ansindex--}return }

python基础语法--函数

一、函数概述 函数就是执行特定任务完成特定功能的一段代码。可以在程序中将某一段代码定义成函数&#xff0c;并指定一个函数名和接收的输入&#xff08;参数&#xff09;&#xff0c;这样就可以在程序的其他地方通过函数名多次调用并执行该段代码了。 每次调用执行后&#…

【华为】路由综合实验(基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP&#xff0c;使AR4和AR3成为eBGP&#xff0c;AR4和AR5成为iBGP对等体…

AI 图像无损放大器:多平台支持,轻松上手 | 开源日报 No.241

upscayl/upscayl Stars: 25.5k License: AGPL-3.0 upscayl 是一个免费开源的 AI 图像放大器&#xff0c;支持 Linux、MacOS 和 Windows 平台&#xff0c;并且秉承着“Linux 优先”理念构建。 使用先进的 AI 算法对低分辨率图像进行放大和增强在不损失质量的情况下放大图像&am…

ubuntu开启message文件

环境&#xff1a;ubuntu 20.04 1、首先需要修改 /etc/rsyslog.d/50-default.conf 文件&#xff1b;源文件中message被注释&#xff0c;如下图&#xff1a; 2、打开注释&#xff1a; 3、重启服务 systemctl restart rsyslog.service 如此即可&#xff01;