0
点赞
收藏
分享

微信扫一扫

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法求根​​
  • ​​求统计量​​
  • ​​求解数值积分(递归调用)​​
  • ​​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 会认为其为转义字符,故使用双反斜杠或者直接改成斜杠即可。

帮助命令

  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

向量的基本操作

创建向量(数值类型)

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

x <- c(1, 2, 3)
# 等价于
x <- c(1: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!")

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法的迭代格式为

其中:

# 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统计量的函数
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…

采用复化梯形公式

# 递归计算数值积分
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)


举报

相关推荐

0 条评论