R语言学习笔记(一)R语言的基本操作与函数
文章目录
- 写在前面
- R语言GUI操作
- 基本的快捷键与命令
- 帮助命令
- R Studio
- 常用快捷键
- R语言基础语法
- 变量操作
- 运算符
- 数据类型
- 数据类型的判断
- 向量的基本操作
- 创建向量(数值类型)
- 基本运算
- 矩阵(数组)的基本操作
- 控制流语句
- 循环语句
- for循环:for (name in vector_expr) expr
- while循环:while (condition) expr
- repeat循环:repeat expr
- 条件语句
- if-else语句
- ifelse语句
- switch语句
- 用户自定义函数
- 几个例子
- 阶乘的递归生成
- 组合数的计算
- Fibonacci数的生成
- 二分法求根
- Newton法求根
- 求TTT统计量
- 求解数值积分(递归调用)
- R语言导入导出数据
- 使用数据框结构输入数据
- 少量数据键盘输入
- 大量数据行外部导入
- 文本文件
- Excel文件
写在前面
由于MATLAB不能用了,开源数据分析软件的学习热度最近越来越高,掌握一门数据分析&统计的编程语言尤为必要。正好最近在学习R语言,下面就总结一下一些R语言的基本操作。
R语言GUI操作
学习R语言必装的GUI界面软件,清华镜像下载链接。个人感觉界面跟Lingo有几分类似,看起来有点粗糙。
基本的快捷键与命令
清屏命令:Ctrl+L
保存工作镜像:Ctrl+S
退出工作镜像:q()
导入包:library(base)
安装包:install.packages(base)
查看当前工作目录:getwd()
修改当前工作目录:setwd("E:/Desktop/")
注意:在Windows平台下目录默认为反斜杠,R 会认为其为转义字符,故使用双反斜杠或者直接改成斜杠即可。
帮助命令
help.start()
直接在默认浏览器打开本地帮助文件(HTML)?
打开当前项目的help??
打开相关项目的父级help
R Studio
R语言的首选集成开发环境,刚入门的我选择Desktop版本就够用了.官网下载链接。
里面的一些快捷键与GUI版本的R类似,不过多了TAB命令补全以及工作目录、绘图窗口、包管理等多个界面,操作起来更加方便快捷。并且RStudio还支持RMarkdown文件,顾名思义就是使用Markdown语法的文件,只不过多了一点功能,就是可以直接运行R代码,还有个类似于Jupyter Notebook的笔记本文件RNotebook,关于这两个文件格式下回说。
常用快捷键
清屏:Ctrl+L
注释/取消注释:Ctrl+Shift+C
删除光标所在行:Ctrl+D
更改当前工作目录:Ctrl+Shift+H
退出:Ctrl+Q
R语言基础语法
变量操作
变量赋值:x <- 1
或者1 -> x
或者assign("x", 1)
查看所有变量:ls()
清除所有变量:rm(list=ls(all=TRUE))
查看变量的类型:mode(x)
查看变量的长度(元素个数):length(x)
运算符
赋值:x <- 1
或者1 -> x
四则运算:+ - * /
乘方:2^3
不等于:2!=3
整数除法:5 %/% 3
其结果为1
求余:5 %% 3
结果为2
数据类型
数值类型:numeric,包括:数值,数组(向量,矩阵)
字符串类型:character,使用双引号或单引号
逻辑值:TRUE,FALSE(也可以简记为T和F)
非数值:NA(缺失值)、Inf(无穷)、NAN(不确定的数,如0/0)
列表:list,包括数据框(data.frame)
数据类型的判断
> is.na(NA)
[1] TRUE> is.numeric(NA)
[1] FALSE> is.finite(1/0)
[1] FALSE> is.nan(0/0)
[1] TRUE> is.infinite(1/0)
[1] TRUE
向量的基本操作
创建向量(数值类型)
使用函数c()
进行向量的创建
x <- c(1, 2, 3)
# 等价于
x <- c(1:3)
基本运算
- 求和:
sum(x)
- 逐项乘积:
prod(x)
- 取平均:
mean(x)
- 求方差:
var(x)
- 求标准差:
sd(x)
矩阵(数组)的基本操作
- 矩阵乘法:
A%*%B
- 矩阵的转置:
t(A)
- 矩阵的求逆:
solve(A)
- 方阵的行列式:
det(A)
- 矩阵的对角元素:
diag(A)
- 矩阵的QR分解:
qr(A)
- 矩阵的奇异值分解:
svd(A)
- 矩阵的特征值与特征向量:
eigen(A)
控制流语句
循环控制语句:
- break:用于跳出循环
- next:类比Python的pass,执行循环而无实质内容
下面的expr指表达式expression
循环语句
for循环:for (name in vector_expr) expr
for (i in 1:5) print("Hello!")
while循环:while (condition) expr
x <- 5 # 需要初始条件
while(x > 0) {print(x); x <- x-1}
repeat循环:repeat expr
需要break语句来跳出循环。
f <- 1;f[2] <- 1; i <- 1;
repeat {f[i+2] <- f[i] + f[i+1]i <- i+1if (f[i] + f[i+1] < 1000) next else break
}f
条件语句
if-else语句
> x <- 3
> if (x != 1) print("male") else print("female")
[1] "male"
ifelse语句
> x <- 9
> ifelse(x>=0, print('非负数'), print('负数'))
[1] "非负数"
[1] "非负数"
需要注意,上面语句会产生两条同样的输出,其原因是
print()
函数除了会打印内容到屏幕,还会赋值给一个新的变量,所以导致了这种情况的出现。
switch语句
> a <- c("apple", 'banana')
> for (i in a) print(switch(i, banana="香蕉", apple="苹果", orange="橘子"))
[1] "苹果"
[1] "香蕉"
用户自定义函数
name <- function(arg_1, arg_2, ...) expression
几个例子
阶乘的递归生成
Factorial <- function(n) {if (n == 0 || n == 1) return(1)else return(n * Factorial(n-1))
}Factorial(3)
组合数的计算
binom <- function(n, k) {Factorial(n)/(Factorial(k) * Factorial(n-k))
}binom(4, 2)
Fibonacci数的生成
f <- 1;f[2] <- 1; i <- 1;
while (f[i] + f[i+1] < 1000) {f[i+2] <- f[i] + f[i+1]i <- i+1
}f
二分法求根
# 定义二分法函数
fzero <- function(f, a, b, eps=1e-5){if (f(a)*f(b) > 0)list(fail="finding root is fail.")else{repeat {# 达到精度,跳出循环if (abs(b - a) < eps) breakx <- (a+b) / 2if (f(a) * f(x) < 0) b <- x else a <- x}list(root=(a+b)/2, fun=f(x))}
}# 定义待求函数
f <- function(x) x^3 - x - 1;
# 求根
fzero(f, 1, 2, 1e-6)
Newton法求根
Newton法的迭代格式为
x(k+1)=x(k)−[J(x(k))]−1f(x(k)),k=0,1,2,⋯,x^{(k+1)}=x^{(k)}-[J(x^{(k)})]^{-1}f(x^{(k)}), \quad k=0,\,1,\,2,\,\cdots, x(k+1)=x(k)−[J(x(k))]−1f(x(k)),k=0,1,2,⋯,
其中:
J(x)=[∂f1∂x2∂f1∂x1⋯∂f1∂xn∂f2∂x2∂f2∂x1⋯∂f2∂xn⋮⋮⋱⋮∂fn∂x2∂fn∂x1⋯∂fn∂xn]J(x)= \begin{bmatrix} \frac{\partial f_1}{\partial x_2}&\frac{\partial f_1}{\partial x_1}&\cdots&\frac{\partial f_1}{\partial x_n}\\ \frac{\partial f_2}{\partial x_2}&\frac{\partial f_2}{\partial x_1}&\cdots&\frac{\partial f_2}{\partial x_n}\\ \vdots&\vdots&\ddots&\vdots\\ \frac{\partial f_n}{\partial x_2}&\frac{\partial f_n}{\partial x_1}&\cdots&\frac{\partial f_n}{\partial x_n}\\ \end{bmatrix} J(x)=⎣⎢⎢⎢⎢⎡∂x2∂f1∂x2∂f2⋮∂x2∂fn∂x1∂f1∂x1∂f2⋮∂x1∂fn⋯⋯⋱⋯∂xn∂f1∂xn∂f2⋮∂xn∂fn⎦⎥⎥⎥⎥⎤
# Newton法迭代的函数
Newtons <- function(fun, x, eps=1e-5, it_max=100) {index <- 0; k <- 1;while (k <= it_max) {x1 <- x; obj <- fun(x);x <- x - solve(obj$J, obj$f);norm <- sqrt((x - x1) %*% (x - x1))# 达到精度,跳出循环,index赋值为1表示计算成功if (norm < eps) {index <- 1; break}k <- k+1}obj <- fun(x);list(root=x, it_num=k, index=index, FunVal=obj$f)
}# 待求方程组及计算其Jacobi矩阵的函数
funs <- function(x) {f <- c(x[1]^2 + x[2]^2 - 5, (x[1] + 1) * x[2] - (3 * x[1] + 1));J <- matrix(c(2*x[1], 2*x[2], x[2]-3, x[1]+1), nrow=2, byrow = T);list(f=f, J=J)
}# 求解该方程组
Newtons(funs, c(0, 1))
求TTT统计量
首先根据方差相同且未知时的TTT统计量的计算公式:
T=X‾−Y‾S1n1+1n2,T=\frac{\overline{X}-\overline{Y}}{S\sqrt{\frac1{n_1}+\frac1{n_2}}}, T=Sn11+n21X−Y,
其中
S2=(n1−1)S12+(n2−1)S22n1+n2−2,S^2=\frac{(n_1-1)S_1^2+(n_2-1)S_2^2}{n_1+n_2-2}, S2=n1+n2−2(n1−1)S12+(n2−1)S22,
显然得到以下函数
# 定义计算T统计量的函数
cal_T <- function(y1, y2) {n1 <- length(y1); n2 <- length(y2);yb1 <- mean(y1); yb2 <- mean(y2);square_s1 <- var(y1); square_s2 <- var(y2);square_s <- ((n1-1) * square_s1 + (n2-1) * square_s2) / (n1 + n2 - 2);T <- (yb1 - yb2) / sqrt(square_s * (1 / n1 + 1 / n2)); T
}# 输入数据A, B
A <- c(79.98, 80.04, 80.02, 80.04, 80.03, 80.03, 80.04,79.97, 80.05, 80.03, 80.02, 80.00, 80.02)
B <- c(80.02, 79.94, 79.98, 79.97, 79.97, 80.03, 79.95,79.97)
# 进行计算
cal_T(A, B)
求解数值积分(递归调用)
KaTeX parse error: Undefined control sequence: \mbox at position 37: …thrm{d}x, \quad\̲m̲b̲o̲x̲{精度}\varepsilon…
采用复化梯形公式
Tn=h2∑k=0n−1[f(xk)+f(xk+1)]=h2∑k=0n−1[f(a)−2∑k=1n−1f(xk)+f(b)]T_n = \frac h2\sum\limits_{k=0}^{n-1}\left[f(x_k)+f(x_{k+1})\right]=\frac h2\sum\limits_{k=0}^{n-1}\left[f(a)-2\sum_{k=1}^{n-1}f(x_k)+f(b)\right] Tn=2hk=0∑n−1[f(xk)+f(xk+1)]=2hk=0∑n−1[f(a)−2k=1∑n−1f(xk)+f(b)]
# 递归计算数值积分
area <- function(f, a, b, eps=1e-6, lim=10) {fun1 <- function(f, a, b, fa, fb, a0, eps, lim, fun) {d <- (a+b)/2; h <- (b-a) / 4; fd <- f(d);a1 <- h * (fa + fd); a2 <- h * (fd + fb);if (abs(a0 - a1 - a2) < eps || lim == 0)return (a1 + a2)else {return (fun(f, a, d, fa, fd, a1, eps, lim - 1, fun) + fun(f, d, b, fd, fb, a2, eps, lim - 1, fun))}}# 设定初始值fa <- f(a); fb <- f(b); a0 <- ((fa + fb) * (b - a)) / 2fun1(f, a, b, fa, fb, a0, eps, lim, fun1)
}#定义函数
f <- function(x) 1/x# 计算数值积分
quad <- area(f, 1, 5); quad
R语言导入导出数据
使用数据框结构输入数据
少量数据键盘输入
mydata <- data.frame(age=numeric(0), weight=numeric(0), gender=character(0));
mydata <- edit(mydata)
# 另一种更加直接的方法
fix(mydata)
大量数据行外部导入
文本文件
方法一:
默认以ASCII码进行编码,需要更改编码方式(文件另存为ASCII格式)。
data <- read.table("F:/data/data.txt", header=TRUE, sep=",", what=character(0))
head(data) # 默认读取前6行数据(不含列索引)
方法二:
使用scan()
函数可以直接读取纯文本文件中的数据。
data1 <- scan("F:/data/data.txt")
data1
Excel文件
另存为逗号分隔符文件(.CSV), 可以进行直接读取
data1 <- read.table("F:/data/data.csv", header=TRUE, sep=",")
head(data1)
R语言学习笔记(一)R语言的基本操作与函数相关推荐
- c语言注释语句执行吗,C语言学习笔记之C语言概念解析(附资料分享)每一个语句都必须以分号结尾但预处理命令函数头和花括号“}”之后不能加分号...
[[怪兽爱C语言]C语言学习笔记之C语言概念解析(附资料分享)]https://toutiao.com/group/6582429294901854728/?iid=15906422033&a ...
- Dart 语言学习笔记(Dart语言完全指南)
Dart 语言学习笔记 Part 1:概览 Dart是一门纯OOP语言.所有的类都继承于Object类.null也是对象,变量仅仅存储对象的引用 Dart是强类型语言,即使Dart可以进行类型推断(使 ...
- C语言学习笔记---初始C语言006
C语言程序设计笔记---006 C语言初识关键字和宏定义 1.数据类型关键字 2.存储类型关键字 3.控制语句关键字 3.1.跳转结构关键字: 3.2.循环结构关键字: 3.3.分支结构关键字: 3. ...
- C语言学习笔记---初始C语言001
C语言程序设计笔记---001 初识C语言 1.C语言的标准 2.C语言的特点 3.第一个C程序 ***/知识点汇总/*** 基于VS2019编译器展示一下 代码片: 4.自我介绍 初识C语言 1.前 ...
- C语言学习笔记:C语言的指针函数与函数指针??
前言 在C语言里函数.指针这两个词结合的顺序不同其意义也不同,即指针函数与函数指针的意义不同,这是什么情况呢?估计许多学习C语言的小伙伴已经感觉自己懵懵的了,别急且听小编来说个明白. 指针函数 指针函 ...
- C语言学习笔记之C语言简史(不看后悔系列)
文章目录 C语言简史 一.什么是C语言? 只要计算机体系架构不变,C语言就会长盛不衰. C语言简史 一.什么是C语言? 麻省理工学院,AT&T贝尔实验室,通用电气,三方大佬,准备为GE-645 ...
- [R语言学习笔记1] R语言for循环的使用
学习R语言的过程中,后期逐渐就会用循环语句来减少自己的重复工作.所以了解for循环,是必备技能之一. R语言中的for循环结构是: for (循环变量 in 序列向量){表达式1表达式2...} 要注 ...
- R语言学习笔记--《R语言实战》
文章目录 R语言基础 一.数据结构 1. 向量 2. 矩阵 3. 数组 4. 数据框 5.列表 二.数据输入 1.键盘输入 2.分隔符文本输入 (csv) 图形初阶 一.图形参数 1.符号和线条 2. ...
- r语言绘制精美pcoa图_[R语言 学习笔记]用R做主坐标分析(PCoA)
原始数据为遗传距离矩阵,使用ape包的pcoa函数进行主坐标分析,然后使用ggplot2进行绘图. 欢迎大家批评指正 转载请标明出处:https://www.ivistang.com/articles ...
- C语言学习笔记1——C语言程序
C语言简介: BCPL ->newB ->C ->UNIX ->Minux ->Linux ->gcc C语言诞生于1970-1973年,在肯·汤姆逊和丹尼斯·里奇 ...
最新文章
- Unity5.6+ 导出Android 应用程序apk的环境配置及导出过程
- 使用jmeter测试java程序
- java.util.Random 实现原理
- Oracle11g 修改数据库编码(UTF-8修改为GBK)
- python 异常分类_Python异常类型
- 2020_12-电路理论框架复习思考-基础篇
- azure db 设置时区_在Azure Cosmos DB中应用字段运算符和对象
- 迫不及待,英特尔推特“官宣”GPU发布时间
- mapreduce代码示例_MapReduce算法示例
- 栅格化渲染源码解析-neural_renderer源码(三)栅格化
- 华维单片机编程-无线红外探测器03-环境搭建及程序详解
- xmanager5连接CENTOS6
- JS 实现驼峰式转下横线,下横线转驼峰式2
- svn co 指定用户名
- Android IO流程你真的清楚了吗|硬核科普
- php生鲜超市系统,毕业论文:基于PHP平台下的Ajax开发实践—网上生鲜超市系统的开发...
- c++ opencv实现图像对比度增强
- SEH X64(1)
- RS232转Profinet网关连接3路扫码枪配置案例
- 卷完了!分享下我的秋招面经(投递近50家自动驾驶与机器人公司)