当前位置:   article > 正文

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

r语言清屏

写在前面

由于MATLAB不能用了,开源数据分析软件的学习热度最近越来越高,掌握一门数据分析&统计的编程语言尤为必要。正好最近在学习R语言,下面就总结一下一些R语言的基本操作。

R语言GUI操作

学习R语言必装的GUI界面软件,清华镜像下载链接。个人感觉界面跟Lingo有几分类似,看起来有点粗糙。

基本的快捷键与命令

清屏命令:Ctrl+L


保存工作镜像:Ctrl+S

退出工作镜像:q()


导入包:library(base)

安装包:install.packages(base)


查看当前工作目录:getwd()

修改当前工作目录:setwd("E:/Desktop/")

注意:在Windows平台下目录默认为反斜杠,R 会认为其为转义字符,故使用双反斜杠或者直接改成斜杠即可。


帮助命令

  1. help.start()直接在默认浏览器打开本地帮助文件(HTML)
  2. ?打开当前项目的help
  3. ??打开相关项目的父级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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

向量的基本操作

创建向量(数值类型)

使用函数c()进行向量的创建

x <- c(1, 2, 3)
# 等价于
x <- c(1:3)
  • 1
  • 2
  • 3

基本运算

  1. 求和:sum(x)
  2. 逐项乘积:prod(x)
  3. 取平均:mean(x)
  4. 求方差:var(x)
  5. 求标准差:sd(x)

矩阵(数组)的基本操作

  1. 矩阵乘法:A%*%B
  2. 矩阵的转置:t(A)
  3. 矩阵的求逆:solve(A)
  4. 方阵的行列式:det(A)
  5. 矩阵的对角元素:diag(A)
  6. 矩阵的QR分解:qr(A)
  7. 矩阵的奇异值分解:svd(A)
  8. 矩阵的特征值与特征向量:eigen(A)

控制流语句

循环控制语句:

  • break:用于跳出循环
  • next:类比Python的pass,执行循环而无实质内容

下面的expr指表达式expression

循环语句

for循环:for (name in vector_expr) expr
for (i in 1:5) print("Hello!")
  • 1
while循环:while (condition) expr
x <- 5 # 需要初始条件
while(x > 0) {print(x); x <- x-1}
  • 1
  • 2
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

条件语句

if-else语句
> x <- 3
> if (x != 1) print("male") else print("female")
[1] "male"
  • 1
  • 2
  • 3
ifelse语句
> x <- 9
> ifelse(x>=0, print('非负数'), print('负数'))
[1] "非负数"
[1] "非负数"
  • 1
  • 2
  • 3
  • 4

需要注意,上面语句会产生两条同样的输出,其原因是print()函数除了会打印内容到屏幕,还会赋值给一个新的变量,所以导致了这种情况的出现。

switch语句
> a <- c("apple", 'banana')
> for (i in a) print(switch(i, banana="香蕉", apple="苹果", orange="橘子"))
[1] "苹果"
[1] "香蕉"
  • 1
  • 2
  • 3
  • 4

用户自定义函数

name <- function(arg_1, arg_2, ...) expression
  • 1

几个例子

阶乘的递归生成
Factorial <- function(n) {
  if (n == 0 || n == 1) 
    return(1)
  else 
    return(n * Factorial(n-1))
}

Factorial(3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
组合数的计算
binom <- function(n, k) {
  Factorial(n)/(Factorial(k) * Factorial(n-k))
}

binom(4, 2)
  • 1
  • 2
  • 3
  • 4
  • 5
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
二分法求根
# 定义二分法函数
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
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)= [f1x2f1x1f1xnf2x2f2x1f2xnfnx2fnx1fnxn]

f1x2f2x2fnx2f1x1f2x1fnx1f1xnf2xnfnxn
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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
求解数值积分(递归调用)

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

R语言导入导出数据

使用数据框结构输入数据

少量数据键盘输入

mydata <- data.frame(age=numeric(0), weight=numeric(0), gender=character(0));
mydata <- edit(mydata)  
# 另一种更加直接的方法
fix(mydata)
  • 1
  • 2
  • 3
  • 4

大量数据行外部导入

文本文件

方法一:

默认以ASCII码进行编码,需要更改编码方式(文件另存为ASCII格式)。

data <- read.table("F:/data/data.txt", header=TRUE, sep=",", what=character(0))
head(data)  # 默认读取前6行数据(不含列索引)
  • 1
  • 2

方法二:

使用scan()函数可以直接读取纯文本文件中的数据。

data1 <- scan("F:/data/data.txt")
data1
  • 1
  • 2
Excel文件

另存为逗号分隔符文件(.CSV), 可以进行直接读取

data1 <- read.table("F:/data/data.csv", header=TRUE, sep=",")
head(data1)
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/66045
推荐阅读
相关标签
  

闽ICP备14008679号