加载常用的包
library(tidyverse)
library(readxl)
library(openxlsx)
library(lubridate)
1 R基础相关
1.1 基础命令
1.1.1 set_names命令
set_names()
命令可以很方便的创建带名称的向量,set_names(x, nm = x, ...)
其中x
表示需要赋名的变量,nm
表示向量的名称,示例:
set_names(1:4, letters[1:4])
# a b c d
# 1 2 3 4
1.2 数学公式测试
行内公式\(x^2+y^2=z^2\)
行间公式:\[f(x)=ax+b\]
1.3 逻辑运算符号
R中基础逻辑运算符号有(=
;!=
;>
;<
;>=
;<=
),返回的值是true
和false
,也可分别作为为数字1
和0
进行数学运算:
x <- c(1, 2, 3, 4, 5, 6)
x > 3
# [1] FALSE FALSE FALSE TRUE TRUE TRUE
sum(x > 3)
# [1] 3
1.4 数学运算
- %% 两个向量求余
x <- c(1, 2, 3)
y <- c(4, 5, 6)
y%%x
# [1] 0 1 0
- %/% 两个向量相除求商
x <- c(1, 2, 3)
y <- c(4, 5, 6)
y%/%x
# [1] 4 2 2
%*% 两个向量的内积,也称为点乘,可用于矩阵
- 对于向量
x <- c(1, 2, 3)
y <- c(4, 5, 6)
y %*% x
# [,1]
# [1,] 32
- 对于矩阵
m <- matrix(c(1:4), ncol = 2)
m %*% m
# [,1] [,2]
# [1,] 7 15
# [2,] 10 22
1.5 向量操作
增加向量元素的几种操作
- 直接使用
c()
x <- c(1, 2, 3)
newvalues <- 4:9
c(x, newvalues)
# [1] 1 2 3 4 5 6 7 8 9
- 在末尾添加
x <- c(1, 2, 3)
x[length(x) + 1] <- 99
x
# [1] 1 2 3 99
- 在指定位置增加
append(VEC, newvalues, after = N)
:
x <- c(1, 2, 3)
newvalues <- c(55, 66, 77)
append(x, newvalues, 2)
# [1] 1 2 55 66 77 3
1.6 []
和[[]]
取值的区别,[[]]
等价与$
取元素:
x <- c(1, 2, 3)
x[1]
# [1] 1
x[[1]]
# [1] 1
lsx <- list(name = c("tom", "jimy", "tod"), score = c(98, 80, 95))
lsx[2][1]
# $score
# [1] 98 80 95
lsx[[2]][1]
# [1] 98
lsx$score[1]
# [1] 98
1.7 list
的一些操作和理解
list
作为特殊的变量,它可以存储任意类型的数据,包括其他的list
,也就是列表列。R中列表的高端操作有些抽象,不太好理解,需要自己动手多操作。
1.8 print()
和cat()
的区别
主要是输出内容的形式,直观来说cat()
输入的内容更复核自然阅读的习惯,而print()
输入的内容更类似程序的语法结构
1.8.1 这是print()
输出的结果
print(c("hello", "world", "!"))
# [1] "hello" "world" "!"
1.8.2 这是cat()
输出的结果
cat(c("hello", "world", "!"))
# hello world !
1.9 创建序列的区别
使用:
创建的都是整数序列,使用seq()
创建的序列是double
。
a <- 1:10
b <- seq(from = 1, to = 10, by = 1)
identical(a, b)
# [1] FALSE
2 统计分析相关
2.1 概率
- R中有关概率分布相关函数(2.1)
函数 | 功能 |
---|---|
dnorm(x, mean = 0, sd = 1, log = FALSE) | 返回值正态分布概率密度函数值,比如dnorm(z)表示:标准正态分布密度函\(f(x)\)在x=z处的函数值。 |
pnorm(q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) | 返回值是正态分布的分布函数值,比如pnorm(z)等价于\(P[X ≤ z]\) |
qnorm(p, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) | 返回值是给定概率p后的下分位点. |
rnorm(n, mean = 0, sd = 1) | 返回值是n个正态分布随机数构成的向量。 |
- 其他概率分布(2.2),其命令用法与正态分布函数类似。
概率分布 | R 命令名 | 参数 |
---|---|---|
Beta | beta | shape1; shape2 |
Cauchy | cauchy | location; scale |
Chi-squared (Chisquare) | chisq | df = degrees of freedom |
Exponential | exp | rate |
F | f | df1 and df2 = degrees of freedom |
Gamma | gamma | rate; either rate or scale |
Log-normal (Lognormal) | lnorm | meanlog = mean on logarithmic scale; sdlog = standard deviation on logarithmic scale |
Logistic | logis | location; scale |
Normal | norm | mean; sd = standard deviation |
Student’s | t | (TDist) t df = degrees of freedom |
Uniform | unif | min = lower limit; max = upper limit |
Weibull | weibull | shape; scale |
Wilcoxon | wilcox | m = number of observations in first sample; n = number of observations in second sample |
2.2 基础统计
sd()
和var()
分别计算标准差和方差
x <- runif(20)
y <- 2 * (x + 1)
sd(x)
# [1] 0.332
var(x)
# [1] 0.11
cor()
和cov()
函数可以分别计算两个向量之间的相关性和协方差:
cor(x, y)
# [1] 1
cov(x, y)
# [1] 0.22
2.3 线性回归
- 线性回归语法
lm()
2.3.1 一简单线性模型
lm(y ~ x1 + x2, date = sim)
对应建模公式为:\[y=\alpha+\beta_1x_1+\beta_2x_2+\varepsilon\]
2.3.2 交互变量性模型
lm(y ~ x1 * x2, date = sim)
对应建模公式为:\[y=\alpha+\beta_1x_1+\beta_2x_2++\beta_3x_1x_2+\varepsilon\]
2.3.3 虚拟变量
lm(y ~ x1 + x1:x2, date = sim)
对应建模公式为:\[y=\alpha+\beta_1x_1+\beta_2x_1x_2+\varepsilon\]
3 rmarkdown相关
3.1 表格
kable()
knitr::kable(head(mtcars))
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.62 | 16.5 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.88 | 17.0 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.32 | 18.6 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.21 | 19.4 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.44 | 17.0 | 0 | 0 | 3 | 2 |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.46 | 20.2 | 1 | 0 | 3 | 1 |
- 除了
kable()
命令生成表格外,其他的表格生成如果要使其能被交叉引用,需要添加标签label
,如:Table:(\#tab:yourlabel)Caption
,然后使用\@ref(tab:label)
。例如:
样本身高体重见表3.1
Table:(\#tab:table001)A simple table
left | center | right
:-----|:------:|------:
A | 180 | 60
B | 160 | 50
c | 170 | 30
left | center | right |
---|---|---|
A | 180 | 60 |
B | 160 | 50 |
c | 170 | 30 |
3.2 图片
微信截图的图片不能被knit
正确读取,会提示找不到文件,需要更改文件类型或者名字?
4 R对Excel的操作
Excel是平实工作中用得最多的存储数据文件,有时候会牵涉合并、汇总等等操作。使用R的一些包能非常方便的批量操作Excel文件。 ## 读取Excel
推荐使用opnexlsx
、readxl
包,常用的有以下操作
excel_sheets()
可以获取工作簿的名称list.dirs()
, 获取文件夹名,fullname = T
获取带完整路径的名称list.files()
,获取文件目录中所有文件名称,同样有fullname
参数。read_excel
读取不同版本Excel文件。read.xlsx
其中detectDates
参数在读取含有日期变量的文件时非常有用。
test <- read.xlsx("data/testdata.xlsx", detectDates = T)
read.xlsx("data/testdata.xlsx", detectDates = F)
# name birthdata age group Time
# 1 aa 37157 20 A 44361
# 2 bb 38960 15 A 44575
# 3 cc 37887 18 B 44379
# 4 dd 38367 17 A 44480
# 5 ee 40254 12 B 44416
# 6 ff 43741 2 C 44568
# 7 gg 39348 14 B 44513
# 8 hh 39847 13 C 44316
# 9 ii 39223 15 C 44438
test %>%
mutate(Time2 = as.Date(Time, origin = "1899-12-30 00:00:00"))
# name birthdata age group Time Time2
# 1 aa 2001-09-23 20 A 44361 2021-06-13
# 2 bb 2006-08-31 15 A 44575 2022-01-13
# 3 cc 2003-09-23 18 B 44379 2021-07-01
# 4 dd 2005-01-15 17 A 44480 2021-10-11
# 5 ee 2010-03-17 12 B 44416 2021-08-07
# 6 ff 2019-10-03 2 C 44568 2022-01-06
# 7 gg 2007-09-23 14 B 44513 2021-11-12
# 8 hh 2009-02-03 13 C 44316 2021-04-29
# 9 ii 2007-05-21 15 C 44438 2021-08-29