赞
踩
由于MATLAB不能用了,开源数据分析软件的学习热度最近越来越高,掌握一门数据分析&统计的编程语言尤为必要。正好最近在学习R语言,下面就总结一下一些R语言的基本操作。
学习R语言必装的GUI界面软件,清华镜像下载链接。个人感觉界面跟Lingo有几分类似,看起来有点粗糙。
清屏命令:Ctrl+L
保存工作镜像:Ctrl+S
退出工作镜像:q()
导入包:library(base)
安装包:install.packages(base)
查看当前工作目录:getwd()
修改当前工作目录:setwd("E:/Desktop/")
注意:在Windows平台下目录默认为反斜杠,R 会认为其为转义字符,故使用双反斜杠或者直接改成斜杠即可。
help.start()
直接在默认浏览器打开本地帮助文件(HTML)?
打开当前项目的help??
打开相关项目的父级helpR语言的首选集成开发环境,刚入门的我选择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)
> 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(A)
svd(A)
eigen(A)
循环控制语句:
下面的expr指表达式expression
for (i in 1:5) print("Hello!")
x <- 5 # 需要初始条件
while(x > 0) {print(x); x <- x-1}
需要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
> x <- 3
> if (x != 1) print("male") else print("female")
[1] "male"
> x <- 9
> ifelse(x>=0, print('非负数'), print('负数'))
[1] "非负数"
[1] "非负数"
需要注意,上面语句会产生两条同样的输出,其原因是
print()
函数除了会打印内容到屏幕,还会赋值给一个新的变量,所以导致了这种情况的出现。
> 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)
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法的迭代格式为
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)= [∂f1∂x2∂f1∂x1⋯∂f1∂xn∂f2∂x2∂f2∂x1⋯∂f2∂xn⋮⋮⋱⋮∂fn∂x2∂fn∂x1⋯∂fn∂xn]
# 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
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
另存为逗号分隔符文件(.CSV), 可以进行直接读取
data1 <- read.table("F:/data/data.csv", header=TRUE, sep=",")
head(data1)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。