R语言学习4:函数,流程控制,数据框重塑

时间:2021-04-02 15:50:37

本系列是一个新的系列,在此系列中,我将和大家共同学习R语言。由于我对R语言的了解也甚少,所以本系列更多以一个学习者的视角来完成。

参考教材:《R语言实战》第二版(Robert I.Kabacoff),书中所提到的John Cook的优秀博文,关于代码规范的《来自Google的R语言编码风格指南》。

Part 1:函数

Section 1:数学与统计函数

数学函数用于对数据作变换。

函数 描述
abx(x) 绝对值
sqrt(x) 平方根
ceiling(x) 天花板,不小于x的最小整数
floor(x) 地板,不大于x的最大整数
trunc(x) 截尾,向\(0\)的方向截取x的整数部分
round(x, digits=n) 四舍五入,保留\(n\)位小数
signif(x, digits=n) 四舍五入,保留\(n\)位有效数字
cos(x), sin(x), tan(x) 三角函数
acos(x), asin(x), atan(x) 反三角函数
cosh(x), sinh(x), tanh(x) 双曲三角函数
acosh(x), asinh(x), atanh(x) 反双曲余弦函数
log(x, banse=n) 对数\(\log_{n}(x)\)
log(x), log10(x) 自然对数\(\ln(x)\)和常用对数\(\lg(x)\)
exp(x) 指数函数

统计函数常用于对数据作变换或统计,以下函数,许多都有如na.rm之类的可选参数,可以使用?function来查询。

函数 描述 应用
mean(x) 平均数 mean(c(1, 2, 3, 4))返回2.5
median(x) 中位数 median(c(1, 2, 3, 4))返回2.5
sd(x) 标准差 sd(c(1, 2, 3, 4))返回1.29
var(x) 方差 var(c(1, 2, 3, 4))返回1.67
mad(x) 绝对中位差 mad(c(1, 2, 3, 4))返回1.48
quantile(x, probs) 求分位数 x是数值向量,probs是概率值向量
range(x) 求值域 range(c(1, 2, 3, 4))返回c(1, 4)
sum(x) 求和 sum(c(1, 2, 3, 4))返回10
diff(x, lag=n) 滞后差分 diff(c(1, 5, 23, 29))返回c(4, 18, 6)
min(x) 求最小值 min(c(1, 2, 3, 4))返回1
max(x) 求最大值 max(c(1, 2, 3, 4))返回4
scale(x, center=TRUE, scale=TRUE) 按列标准化 center进行中心化,scale进行标准化

这里方差的计算是无偏的,即

\[S^2=\frac{1}{n-1}\sum_{j=1}^n(X_j-\bar X)^2.
\]

Section 2:概率函数

在R语言中,概率函数是由d, p, q, r再加上分布的名字缩写所构成的函数,这四个字母分别具有如下的意义:

  • d:密度函数(density)。
  • p:分布函数(distribution function)。
  • q:分位数函数(quantile function),第一个参数为q,代表要求的(下侧)分位点\(\alpha\)。
  • r:生成随机数,第一个参数为n,代表要生成的随机数个数。

分布的名字如下表所示,按字母顺序排序:

分布名 R中缩写
Beta分布 beta
二项分布 binom
柯西分布 cauchy
卡方分布 chisq
指数分布 exp
F分布 t
Gamma分布 gamma
几何分布 geom
超几何分布 hyper
对数正态分布 lnorm
Logistic分布 logis
多项分布 multinom
负二项分布 nbinom
正态分布 norm
泊松分布 pois
Wilcoxon符号秩分布 signrank
t分布 t
均匀分布 unif
Weibull分布 weibull
Wilcoxon秩和分布 wilcox

每个分布都有其可选参数,可以通过?function查询。

设定种子可以让结果可复现,在R语言中,set.seed()函数可以显式指定这个种子。

生成多元正态随机数,可以使用mvrnorm(n, mean, sigma)函数,这里mean是均值向量,sigma是协方差矩阵或相关矩阵。

Section 3:其他实用函数

这里介绍一些其他实用的函数。

length(x)返回对象x的长度。如果x是向量,则返回向量长度;如果x是数据框,则返回变量个数(而不是观测个数),不过要返回数据框的相关信息,最好使用ncol来返回变量个数,nrow来返回观测个数。

seq(from, to, by)函数用于生成一个等差序列,包含fromto,这里by是间距;rep(x, n)将对象x重复n次用于生成一个重复序列;pretty(x, n)将一个连续型变量x通过美观的分割点,分割为近似n个区间。

cut(x, n)将连续型变量x分割成有n个水平的因子,使用选项ordered_result=TRUE可以创建有序型因子。

cat(...)连接...中的对象,并将其输出到屏幕上或文件中,常用于打印字符串,可以用sep指定分隔符,默认为空格。字符串中具有如下的转义字符:\n换行、\t制表符、\'单引号,\b退格等等。

apply(x, MARGIN, FUN, ...)函数允许将任意一个函数应用到矩阵、数组、数据框的任何维度上,这里x是数据对象,MARGIN是维度的下标,矩阵和数据框中MARGIN=1代表行,MARGIN=2代表列,FUN是要运用的函数名。如果要运用的函数还有其他参数,可以在...处指定。

t(x)可以对数据框或者矩阵x进行转置,当x为数据框时,行名将成为转置后的变量名。aggregate(x, by, FUN)是整合函数,类似于SQL中的GROUP BY,这里by是待折叠的变量名,必须在一个列表中(即使只有一个变量),FUN是用于处理整合的函数。

Part 2:其他控制

Section 1:循环与条件结构

循环结构for的语法是:

for (var in seq){
statement
}

循环结构while的语法是:

while (cond){
statement
}

在处理大数据集中的行和列时,R中的循环比较低效费时,最好联合使用R的内置函数和apply族函数。

条件结构if-else的语法是:

if (cond){
statement1
}
else{
statement2
}

else的部分可以没有。以上结构可以紧凑地写成ifelse版本,语法为:

ifelse(cond, statement1, statement2)

这类似于一个三目运算符,如果生成的结果都是向量,使用ifelse更合适。

条件结构switch可以根据一个表达式的值来选择语句执行,语法为:

switch(
expr,
value1 = statement1,
value2 = statement2,
...
)

需要注意的是,如果expr的值是一个字符串,则value1, value2等值的内容也是字符串,但是不需要加引号

Section 2:自编函数

R中使用function函数来自编函数,为了尽可能返回丰富的信息,返回值经常是一个列表,用于存储一系列对象。语法如下:

myfunction <- function(arg1, arg2, ...){
statement
object <- list(value1=value1, value2=value2, ...) # 这句是不一定需要的
return(object) # 如果没有return()则最后一行代码的返回值作为return的内容
}

Section 3:使用reshape2重构数据集

reshape2包是一套重构和整合数据集的万能工具,需要使用前安装:

install.package("reshape2")
library(reshape2)

将使用如下的数据框进行处理。

ID <- c(1, 1, 2, 2)
Time <- c(1, 2, 1, 2)
X1 <- c(5, 3, 6, 2)
X2 <- c(6, 5, 1, 4)
mydata <- data.frame(ID, Time, X1, X2)

R语言学习4:函数,流程控制,数据框重塑

使用该包对数据集进行处理,需要先对数据集进行融合(melt),再进行重铸(cast)。融合使用函数melt(x, id)x是待融合的数据框,id则是数据框的主键,输出一个新的数据框:每个测量变量独占一行,行中包含确定这个测量变量所需的标识符。此时,融合数据框操作的代码为

md <- melt(mydata, id=c("ID", "Time"))

得到的结果是

R语言学习4:函数,流程控制,数据框重塑

可以对融合后的数据框使用dcast()函数进行重铸,调用格式是dcast(md, formula, fun.aggregate),这里md是已融合的数据,formula接受一个公式,描述了最后的想要结果,公式的形式是

\[\text{rowvar1}+\text{rowvar}2+\cdots\quad \sim\quad \text{colvar1}+\text{colvar2}+\cdots
\]

这里,rowvar中的变量作为主键,colvar中的变量作为数据框的值,返回的数据框包含所有的rowvarcolvar作为变量。fun.aggregate参数是可选的整合函数。

R语言学习4:函数,流程控制,数据框重塑