R知识点:简单入门

374 阅读8分钟

简明介绍

R语言是为数学研究工作者设计的一种数学编程语言,主要用于统计分析、数据可视化(统计图表)、数据挖掘。R语言最初由新西兰奥克兰大学的统计学家罗斯·伊哈卡(Ross Ihaka)和罗伯特·杰特曼(Robert Gentleman)于1993年创建,目前由R核心小组负责开发和维护。

  • R语言是一个面向数据科学和统计分析的统计编程语言
  • R语言是一种解释型编程语言
  • R语言可运行于多种平台之上,包括Windows、UNIX和Mac OS X

为什么命名为R语言?有一种说法,Ross Ihaka和Robert Gentleman两位作者的名字的首字母都是R。

R与Python?在数据科学领域,Python能做的,R也能做,甚至更好,比如可视化。有一定R基础后,对统计学的学习帮助很大,这是Python不具备的。

R与Excel?对于数据量不大,或者复杂程度不高的需求来说,Excel很方便也很直观。但随着数据量或复杂程度不断增大,Excel解决起来难度系数就陡增,或者无法搞定,这就需要借助R编写代码完成。

R与C?R语言来自S语言,而S语言由Rick Becker, John Chambers, Alan Wilks等人在贝尔实验室开发,著名的C语言、Unix系统也是贝尔实验室开发的。R语言与C语言有不同的侧重领域,R语言是一种解释型的面向数学理论研究工作者的语言,而C语言是为计算机软件工程师设计的。

环境安装

Windows

官方网站下载最新版本的安装程序(R-4.4.1-win.exe),双击运行下载的安装包,使用默认设置安装即可。

说明:Windows用户需要安装Rtools。从官方网站下载Rtools44 installer版本安装即可(下载R语言相匹配的版本)。

Linux

$ apt-get install r-base
$ R --version

集成环境

R软件本身提供图形界面(RGui),但推荐使用专门为R语言量身定制的集成开发环境(IDE)RStudio。从官方网站下载RStudio Desktop版本安装即可。

RStudio中可以通过快捷键Alt+-(Windows)快速输入赋值符号<-。

编程方式

交互式

使用R命令进入交互式的编程窗口。

$ R

脚本文件

使用Rscript命令(解释器)执行脚本文件(以.R为后缀名的文本文件)。

$ Rscript script.R

帮助文档

image.png

基础知识

R中所有的存在都是对象;R中发生的动作都是函数调用。

注释

R语言的注释符号为#,但只支持单行注释,如果有多行注释只需要在每一行添加#号。

# R语言实现两个数相加
a <- 9
b <- 4
print(a + b)

说明:使用if语句也可以实现多行注释

if(FALSE) {
	"
	这是一个多行注释的实例
	注释内容放在单引号或双引号之间
	"
}

变量

变量名称由字母、数字、点号.或下划线_组成,以字母或点开头。变量名称是区分大小写的。

变量赋值

最新版本的R语言可以使用左箭头<-、等号= 、右箭头->为变量赋值。

> var.1 = c(0,1,2,3)
> var.2 <- c("learn","R")
> c(TRUE,1) -> var.3
> print(var.1)
[1] 0 1 2 3
> print(var.2)
[1] "learn" "R"    
> print(var.3)
[1] 1 1
> 

查看变量

使用ls()函数查看已定义的变量。

删除变量

使用rm()函数删除变量。

运算符

image.png

说明:当两个向量长度相等的时候,就一一对应的完成计算;当两个向量长度不相等的时候,短的向量会循环补齐(recycling),保持与长向量的长度一致后,再做运算。当长向量的长度不是短向量的整数倍的时候,R语言会提出友好的警告。因此,为了代码的可读性,除非某一个向量长度为1,尽可能避免长度不一致的向量之间的运算。

特殊值

  • Inf(Infinity):表示无限大。-Inf表示无限小

  • NaN(Not a Number):表示非数值

  • NA(Not available):表示缺失状态

  • NULL(No value):表示没有值,或者空值的意思,表示变量实际上没有任何值,或者甚至不存在。

数据类型

image.png

typeof(x)	      # 返回类型,区分integer和double
mode(x)	      # 返回模式,将integer和double当作numeric
storage.mode(x) # 返回模式,与mode()函数相同
class(x)        # 返回类别
# 判断函数
is.logical(x)   # 是否为逻辑型
is.numeric(x)   # 是否为数值型
is.integer(x)   # 是否为整数型
is.double(x)    # 是否为双精度型
is.character(x) # 是否为字符型
is.complex(x)   # 是否为复数型
is.raw(x)	      # 是否为原生型
# 转换函数

image.png

数据结构

image.png

流程控制

分支语句

如果符合条件(必须返回逻辑值,即TRUE或者FALSE),就执行某个操作。

if (condition1) {
	expression1
} else if (condition2) {
	expression2
} else if (condition3) {
	expression3
} else {
	expression
}
# 快捷方式
ifelse(test, yes, no)
# expression可以是整数或字符串,如果是整数则返回对应位置的值,如果是字符串则返回对应的变量名的值
switch(expression, case1, case2, case3....)

for循环语句

遍历一个可迭代对象(如一个向量),并重复执行某个操作。---计数循环

for (var in seq) {
	expression
}

while循环语句

只要符合条件就重复执行某个操作。---当型循环,可能一次都不执行

while(condition) {
   expression
}

说明:while循环比for循环简单,for循环总是可以改写成while循环,但是while循环不一定能改写成for循环。

repeat循环语句

重复执行某个操作(一般在循环体内用if与break退出)。---直到型循环,至少执行一次

repeat {
	expression
	if(condition) {
	   break
	}
}

循环控制语句

  • break:退出当前循环

  • next:跳过本轮循环,开始下一轮循环(类似其他语言的continue)

自定义函数

函数定义

function_name <- function(arg_1, arg_2, ...) {
	expression
	return(output)
}

(1)形式参数可以为空,也可以为多个,形式参数可以指定缺省值。在定义函数时,没有缺省值的参数写在前面,有缺省值的参数写在后面。

(2)返回值默认是函数体的最后一个表达式,也可以用return(x)指定返回值。如果函数需要返回多个结果,可以打用列表(list)进行包装。函数可以返回一个invisible(y), 表示其返回的值仍是y的值,但直接在R命令行调用此函数时不自动显示返回值,print()或cat()显式地要求才显示。

(3)允许使用没有函数名的函数对象, lapply类的函数经常使用无名函数对象作为输入。R为无名函数提供了\(x) expression这样的简写格式。

vapply(iris[,1:4], function(x) max(x) - min(x), 0.0)
vapply(iris[,1:4], (x) max(x) - min(x), 0.0)

函数调用

(1)可以按照位置顺序传入实参,也可以按照名称传入实参(name=object

fsub(3, 1)
fsub(x=3, y=1)

(2)将形参、实参对应关系写成一个列表,通过do.call()函数进行函数调用

fsub(3, y=1)
do.call(fsub, list(3, y=1))

(3)使用管道操作符来简化函数的复合调用

sum(log(x, b))
x |> log(base = b) |> sum()

说明:R从4.1.0版本开始提供了一个|>管道运算符可以对同一个变量进行多个步骤的操作,例如h(g(f(x)))可以写成 x |> f() |> g() |> h()。在|>表示的管道中, 上一步的输出通过管道作为下一步的第一个自变量。如果需要当作下一步的其它自变量,可以用自变量名 = _的特殊格式, 这里_代表管道中上一步的结果。

(4)递归调用时最好用Recall代表调用自身,这样保证函数即使被改名递归调用仍指向原来定义。

fib1 <- function(n){
  if(n == 0) return(0)
  else if(n == 1) return(1)
  else if(n >=2 ) {
	return(Recall(n-1) + Recall(n-2))
  }
}

输入输出

  • 使用print()函数输出到控制台
  • 使用cat()函数输出到文件
  • 使用sink()函数将控制台输出写入到文件
print(123)
print("123")
# 覆盖写入
cat("hello", file="r_test.txt")
# 追加写入
cat("world", file="r_test.txt", append=TRUE)
# 控制台和文件同样输出
sink("r_test.txt", split=TRUE)
print("hello r!")
# 取消输出到文件
sink()

包管理

包(Package)是R程序,注释文档、实例、测试数据等资源的集合。

  • CRAN(Comprehensive R Archive Network,R综合档案网络):R语言社区推荐的标准源,一般建议使用国内镜像源安装。使用install.packages()函数下载和安装。
  • Bioconductor:专门存储生物信息学(bioinformatics)分析所用R包的网站,一般建议使用国内镜像源安装。使用BiocManager::install()函数下载和安装。
  • GitHub:分享在GitHub网站。使用devtools::install_github()函数下载和安装。
  • 本地安装:手动下载安装包。使用devtools::install_local()函数安装。

内置R包:base、datasets、utils、graphics

# 查看包的安装目录
print(.libPaths())
# 查看已安装的包
print(library())
# 查看已载入的包
print(search())
# 使用包名安装新包
install.packages("package_name")
install.packages("package_name", repos = "https://mirrors.ustc.edu.cn/CRAN/")
# 使用本地文件安装新包
install.packages("package_name.zip")
# 载入包
library("package_name")

参考资料

R语言官方网站

R语言官方镜像

数据科学中的R语言

R 语言教程 | 菜鸟教程

R语言教程

R语言零基础入门

R语言:从基础到进阶