R语言学习笔记(一)R语言的基本操作与函数

    技术2022-07-10  93

    文章目录

    写在前面R语言GUI操作基本的快捷键与命令帮助命令 R Studio常用快捷键 R语言基础语法变量操作运算符数据类型数据类型的判断 向量的基本操作创建向量(数值类型)基本运算 矩阵(数组)的基本操作控制流语句循环语句for循环:for (name in vector_expr) exprwhile循环:while (condition) exprrepeat循环:repeat expr 条件语句if-else语句ifelse语句switch语句 用户自定义函数几个例子阶乘的递归生成组合数的计算Fibonacci数的生成二分法求根Newton法求根求 T T T统计量求解数值积分(递归调用) 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+1 if (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) break x <- (a+b) / 2 if (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 ) ) ] − 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)=x2f1x2f2x2fnx1f1x1f2x1fnxnf1xnf2xnfn

    # 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 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 XY, 其中 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+n22(n11)S12+(n21)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=0n1[f(xk)+f(xk+1)]=2hk=0n1[f(a)2k=1n1f(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

    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)
    Processed: 0.011, SQL: 9