R语言学习4:函数,流程控制,数据框重塑
函数,流程控制,数据框重塑
本系列是一个新的系列,在此系列中,我将和大家共同学习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 进行标准化 |
这里方差的计算是无偏的,即
\]
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)
函数用于生成一个等差序列,包含from
和to
,这里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)
使用该包对数据集进行处理,需要先对数据集进行融合(melt),再进行重铸(cast)。融合使用函数melt(x, id)
,x
是待融合的数据框,id
则是数据框的主键,输出一个新的数据框:每个测量变量独占一行,行中包含确定这个测量变量所需的标识符。此时,融合数据框操作的代码为
md <- melt(mydata, id=c("ID", "Time"))
得到的结果是
可以对融合后的数据框使用dcast()
函数进行重铸,调用格式是dcast(md, formula, fun.aggregate)
,这里md
是已融合的数据,formula
接受一个公式,描述了最后的想要结果,公式的形式是
\]
这里,rowvar
中的变量作为主键,colvar
中的变量作为数据框的值,返回的数据框包含所有的rowvar
和colvar
作为变量。fun.aggregate
参数是可选的整合函数。