由于MATLAB不能用了,开源数据分析软件的学习热度最近越来越高,掌握一门数据分析&统计的编程语言尤为必要。正好最近在学习R语言,下面就总结一下一些R语言的基本操作。
学习R语言必装的GUI界面软件,清华镜像下载链接。个人感觉界面跟Lingo有几分类似,看起来有点粗糙。
清屏命令:Ctrl+L
保存工作镜像:Ctrl+S
退出工作镜像:q()
导入包:library(base)
安装包:install.packages(base)
查看当前工作目录:getwd()
修改当前工作目录:setwd("E:/Desktop/")
注意:在Windows平台下目录默认为反斜杠,R 会认为其为转义字符,故使用双反斜杠或者直接改成斜杠即可。
R语言的首选集成开发环境,刚入门的我选择Desktop版本就够用了.官网下载链接。
里面的一些快捷键与GUI版本的R类似,不过多了TAB命令补全以及工作目录、绘图窗口、包管理等多个界面,操作起来更加方便快捷。并且RStudio还支持RMarkdown文件,顾名思义就是使用Markdown语法的文件,只不过多了一点功能,就是可以直接运行R代码,还有个类似于Jupyter Notebook的笔记本文件RNotebook,关于这两个文件格式下回说。
清屏:Ctrl+L 注释/取消注释:Ctrl+Shift+C 删除光标所在行:Ctrl+D 更改当前工作目录:Ctrl+Shift+H 退出:Ctrl+Q
变量赋值: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)
使用函数c()进行向量的创建
x <- c(1, 2, 3) # 等价于 x <- c(1:3)循环控制语句:
break:用于跳出循环next:类比Python的pass,执行循环而无实质内容下面的expr指表达式expression
需要break语句来跳出循环。
f <- 1;f[2] <- 1; i <- 1; repeat { f[i+2] <- f[i] + f[i+1] i <- i+1 if (f[i] + f[i+1] < 1000) next else break } f需要注意,上面语句会产生两条同样的输出,其原因是print()函数除了会打印内容到屏幕,还会赋值给一个新的变量,所以导致了这种情况的出现。
Newton法的迭代格式为 x ( k + 1 ) = x ( k ) − [ J ( x ( k ) ) ] − 1 f ( 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 ) = [ ∂ f 1 ∂ x 2 ∂ f 1 ∂ x 1 ⋯ ∂ f 1 ∂ x n ∂ f 2 ∂ x 2 ∂ f 2 ∂ x 1 ⋯ ∂ f 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ f n ∂ x 2 ∂ f n ∂ x 1 ⋯ ∂ f n ∂ x n ] 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))首先根据方差相同且未知时的 T T T统计量的计算公式: T = X ‾ − Y ‾ S 1 n 1 + 1 n 2 , T=\frac{\overline{X}-\overline{Y}}{S\sqrt{\frac1{n_1}+\frac1{n_2}}}, T=Sn11+n21 X−Y, 其中 S 2 = ( n 1 − 1 ) S 1 2 + ( n 2 − 1 ) S 2 2 n 1 + n 2 − 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…
采用复化梯形公式 T n = h 2 ∑ k = 0 n − 1 [ f ( x k ) + f ( x k + 1 ) ] = h 2 ∑ k = 0 n − 1 [ f ( a ) − 2 ∑ k = 1 n − 1 f ( x k ) + 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)) / 2 fun1(f, a, b, fa, fb, a0, eps, lim, fun1) } #定义函数 f <- function(x) 1/x # 计算数值积分 quad <- area(f, 1, 5); quad方法一:
默认以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另存为逗号分隔符文件(.CSV), 可以进行直接读取
data1 <- read.table("F:/data/data.csv", header=TRUE, sep=",") head(data1)