百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

R语言学习笔记(三)——实用的内置函数

bigegpt 2024-09-05 12:18 92 浏览

导语:前两期小编给大家介绍了R语言和Rstudio的安装(),以及一个非常有用的R包dplyr(R语言学习笔记(二))。此外,作为R语言的初学者也应该掌握一些基本函数,所以本期给大家介绍一些R中非常实用的内置函数,希望对大家有所帮助。

01内置数据集

R语言中有很多内置的数据集,这些数据集存储在datasets这个包中,包含了R中所有的数据类型。R会默认已经加载了这个包。我们可以用data()命令查看R中所有内置的数据集,左边是数据集的名称,右边是数据集的描述。

> data()
Data sets in package ‘datasets’:
AirPassengers          Monthly Airline Passenger Numbers 1949-1960
BJsales                Sales Data with Leading Indicator
BJsales.lead (BJsales)
                       Sales Data with Leading Indicator
BOD                    Biochemical Oxygen Demand

这里介绍几个十分常用的数据集,mtcars收集了美国32种汽车的11个指标,经常用于ggplot2作图的示例数据;iris是一个非常有名的数据集,收集了3种鸢尾花花瓣和花萼的长宽信息,是数据挖掘中常用的示例文件;state.x77收集了美国50个州的基本信息,是画热图的示例文件。

02内置函数

R中有很多实用的内置函数,这里不做系统的介绍,仅列举一些在数据分析中非常实用的函数。

(1)关于NA

对于一组数据来说,如果出现了缺失值,在R中是不能直接进行统计分析的,好在R中有专门针对缺失值的几个函数,下面举例说明。

> x <- c(1, 2, 3, 4, 4, NA)
> mean(x)
[1] NA

向量x中有NA值,看到直接对向量x求平均值结果是不对的,有两种方法可以解决。

> mean(x, na.rm = T)
[1] 2.8
> mean(na.omit(x))
[1] 2.8

第一种是在mean函数中添加na.rm = T参数,也就是计算时先将NA值移除;第二种是先用na.omit()函数移除掉x中的NA值,再计算平均值。

(2)两个向量的关系

数据分析中经常需要找不同组之间的关系,这里有几个常用的函数。

交集(intersect

> x1 <- c(1:5)
> x2 <- c(3:7)
> intersect(x1, x2)
[1] 3 4 5

并集(union

> union(x1, x2)
[1] 1 2 3 4 5 6 7

匹配(match):返回向量1的元素在向量2中的位置

> match(x1, x2)
[1] NA NA  1  2  3

表示x1的5个元素在x2中的位置分别为NA、NA、1、2、3。这个函数的意义在于生成一个索引向量,在数据框的筛选中会非常实用。

(3)基本统计函数

关于基本的统计函数如平均值、标准差等这里不做系统介绍,这里说几个统计函数的特殊用法。

(a)生成随机数

通常用runif(n, min, max)函数,这个函数生成均匀分布的值,n为个数,min和max分别是最小值和最大值,默认参数为0和1。

> runif(5, 1, 10)
[1] 7.236265 7.278368 2.847278 9.544132 6.884813
> runif(5)
[1] 0.6437805 0.2144422 0.4272817 0.6258470 0.6981409

(b)生成随机整数

一个最简单的办法是round()和runif()函数连用,其中round()是按照四舍五入取整函数。如果要向上或者向下取整,可以使用ceiling()和floor()函数。

> round(0.5)
[1] 0
> round(1.2)
[1] 1
> round(runif(10))       #生成随机的0,1向量
 [1] 0 0 0 1 1 1 1 1 0 0
> round(runif(10, 0, 2))   #生成随机的0,1,2向量
 [1] 0 1 0 1 2 0 2 0 2 1
> ceiling(runif(10, -2, 1))  #生成随机的-1,0,1向量
 [1]  0 -1  1 -1  0 -1  0 -1  1  0
> floor(runif(10, -1, 2))
 [1]  1  0  1  1 -1  1 -1 -1  1 -1

后面几种生成随机向量的方式非常实用,原理就是先用runif()函数生成随机数,然后再用round()函数取整数。基因型数据经常用0,1,2或者-1,0,1表示,我们可以用这种方式模拟基因型数据。

(c)正态分布

用的最多的是rnorm(n, mean, sd)函数,生成n个符合某个正态分布的随机数。用法比较简单,默认的平均值是0,方差是1。

> rnorm(5)
[1] -1.7916223  1.7582387  0.2924384  0.3130404 -0.5076251
> rnorm(5, 3, 1)
[1] 1.968562 4.885262 4.634220 3.017137 3.990052

(4) 其他函数

R中还有不少常用的函数,这里仅列举三个。

(a)summary函数

这个函数是一个比较“万金油”的函数,可以单独对向量或者矩阵使用,会给出一些基本的统计量,包括极值、中位数、平均数等等。

> summary(1:10)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    3.25    5.50    5.50    7.75   10.00
> summary(matrix(10:15, nrow = 2))
       V1              V2              V3       
 Min.   :10.00   Min.   :12.00   Min.   :14.00  
 1st Qu.:10.25   1st Qu.:12.25   1st Qu.:14.25  
 Median :10.50   Median :12.50   Median :14.50  
 Mean   :10.50   Mean   :12.50   Mean   :14.50  
 3rd Qu.:10.75   3rd Qu.:12.75   3rd Qu.:14.75  
 Max.   :11.00   Max.   :13.00   Max.   :15.00

在一些统计分析中也经常使用summary()函数,比如下面的线性回归:

> x <- c(2, 2, 3, 4, 4)
> y <- c(10, 20, 30, 40, 50)
> fm <- lm(y ~ x)
> summary((fm))

Call:

lm(formula = y ~ x)

Residuals:

         1          2          3          4          5 
-5.000e+00  5.000e+00 -1.776e-15 -5.000e+00  5.000e+00 
Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  -15.000      9.037  -1.660   0.1955  
x             15.000      2.887   5.196   0.0138 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.774 on 3 degrees of freedom
Multiple R-squared:    0.9,  Adjusted R-squared:  0.8667 
F-statistic:    27 on 1 and 3 DF,  p-value: 0.01385

可以看到summary()函数给出了很多统计量,包括残差、截距、显著性等等。

(b)table函数

这个函数看起来不起眼,但很实用,给出一个频率分布表,还是举例说明。

> a <- c(rep(NA, 3), rep(1:3, 2))
> a
[1] NA NA NA  1  2  3  1  2  3
> table(a)
a
1 2 3 
2 2 2

上面给出了向量a的频率分布,但没有包含NA,如果要统计NA的数目,则需要添加参数exclude = NULL。

> table(a, exclude = NULL)
a
   1    2    3 <NA> 
   2    2    2    3

需要注意的是生成的频率分布也是一张表,如果需要对这个表进行操作,最好转化成数据框。

> x <- table(a, exclude = NULL)
> class(x)
[1] "table"
> x <- as.data.frame(x)  #将x转换成数据框
> class(x)
[1] "data.frame"

(c)apply/sapply/tapply/mapply

这是一个函数家族,其实就是为了代替for循环,简化代码,这里只介绍apply和tapply。

apply(x, margin, fun, ...)有3个主要的参数,x通常为数据框,margin参数为1或2, 1表示按行,2表示按列,fun为调用函数。比如按列统计mtcars数据集的平均数。

> apply(mtcars, 2, mean)
       mpg        cyl       disp         hp       drat         wt       qsec 
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
        vs         am       gear       carb 
  0.437500   0.406250   3.687500   2.812500

tapply(x, index, fun, ...)通过index对数据集x进行分组运算,相当于上一期dplyr包中的group_by操作。如我们需要统计iris数据集中不同品种鸢尾花的平均花萼长度。

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> tapply(iris$Sepal.Length, iris$Species, mean)
    setosa versicolor  virginica 
     5.006      5.936      6.588

如果用dplyr则是:

> iris %>%
  group_by(Species) %>%
  summarise(mean = mean(Sepal.Length))

3 自编函数

R中虽然有很多内置函数,但具体分析时有时候需要用户自己编写函数。自编函数中有两个非常重要的思想,循环和递归。关于循环相信接触R的人都十分了解,这里只列举两个递归函数的例子。

(1)斐波那契数列

斐波那契数列本身就是用递归定义的F(n) = F(n-1) + F(n-2),因此非常适合用递归函数实现。

> fib <- function(n){        #定义函数
     if(n==1 | n==2){
         return(1)
     }
     else{
         return(fib(n-1)+fib(n-2))
     }
 }
> fib(7)                   #函数调用  
[1] 13

(2)求最大公约数

gcd <- function(a,b) {
   if (b == 0) return(a)
   else return(gcd(b, a %% b))
   }
> gcd(15, 12)
[1] 3

可见,递归是一种比较高级的编程思想,灵活运用能够极大的化繁为简。

结语:以上就是小编认为R中比较实用的一些内置函数,能力有限总结的肯定不够完全,欢迎大家和小编一起交流R语言学习心得。

相关推荐

或者这些Joplin插件也可以帮助你的笔记应用再一次强大

写在前面距离上次分享《搭建私有全平台多端同步笔记,群晖NAS自建JoplinServer服务》已过去一段时间,大家是否开始使用起来了呢?如果你和我一样已经使用过Joplin有一段时间了,那或许你也会...

Three.JS教程4 threejs中的辅助类

一、辅助类简介Three.js提供了一些辅助类(Helpers)以帮助我们更容易地调试、可视化场景中的元素。ArrowHelepr:创建箭头辅助器;AxisHelper:创建坐标轴辅助器;BoxH...

第2章 还记得点、线、面吗(二)(第二章还能敲钟吗)

glbgltf模型(webvrmodel)-gltf模型下载定制,glb模型下载定制,三维项目电商网站在线三维展示,usdz格式,vr模型网,网页VR模型下载,三维模型下载,webgl网页模型下载我...

如何检查Linux系统硬件信息?从CPU到显卡,一网打尽!

你可能会问:“我为什么要关心硬件信息?”答案很简单:硬件是Linux系统的根基,了解它可以帮你解决很多实际问题。比如:性能调优:知道CPU核心数和内存大小,才能更好地调整程序运行参数。故障排查:系统卡...

SpriteJS:图形库造轮子的那些事儿

从2017年到2020年,我花了大约4年的时间,从零到一,实现了一个可切换WebGL和Canvas2D渲染的,跨平台支持浏览器、SSR、小程序,基于DOM结构和支持响应式的,高...

平时积累的FPGA知识点(6)(fpga经典应用100例)

平时在FPGA群聊等积累的FPGA知识点,第六期:1万兆网接口,发三十万包,会出现掉几包的情况,为什么?原因:没做时钟约束,万兆网接口的实现,本质上都是高速serdes,用IP的话,IP会自带约束。...

芯片逻辑调度框架设计 都需要那些那些软件工具

设计芯片逻辑调度框架通常需要使用以下软件工具:1.逻辑设计工具:例如Vivado、Quartus、SynopsysDesignCompiler等,用于设计和实现逻辑电路。2.仿真工具:例如Mo...

ZYNQ与DSP之间EMIF16通信(正点原子领航者zynq之fpga开发指南v3)

本文主要介绍说明XQ6657Z35-EVM高速数据处理评估板ZYNQ与DSP之间EMIF16通信的功能、使用步骤以及各个例程的运行效果。[基于TIKeyStone架构C6000系列TMS320C6...

好课推荐:从零开始大战FPGA(从零开始的冒险4399)

从零开始大战FPGA引子:本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“...

业界第一个真正意义上开源100 Gbps NIC Corundum介绍

来源:内容由「网络交换FPGA」编译自「FCCM2020」,谢谢。FCCM2020在5月4日开始线上举行,对外免费。我们有幸聆听了其中一个有关100G开源NIC的介绍,我们对该文章进行了翻译,并对其中...

高层次综合:解锁FPGA广阔应用的最后一块拼图

我们为什么需要高层次综合高层次综合(High-levelSynthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。所谓的高层次语言,包括C、C++...

Xilinx文档编号及其内容索引(部分)

Xilinx文档的数量非常多。即使全职从事FPGA相关工作,没有几年时间不可能对器件特性、应用、注意事项等等有较为全面的了解。本文记录了我自使用Xilinx系列FPGA以来或精读、或翻阅、或查询过的文...

Xilinx Vivado联合Modelsim软件仿真

引言:Xilinx公司Vivado开发软件自带仿真工具,可以实现一般性能的FPGA软件仿真测试,其测试执行效率以及性能都不如第三方专用仿真软件Modelsim强。本文我们介绍下如何进行Vivado20...

体育动画直播是怎么做出来的?从数据到虚拟赛场的科技魔法!

你是否见过这样的比赛直播?没有真实球员,却能看梅西带球突破?足球比赛变成动画版,但数据100%真实?电竞比赛用虚拟形象直播,选手操作实时同步?这就是体育动画直播——一种融合实时数据、游戏引擎和AI的...

Dialogue between CPC and political parties of neighboring countries held in Beijing

BEIJING,May26(Xinhua)--TheCommunistPartyofChina(CPC)inDialoguewithPoliticalPartiesof...