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参数是可选的整合函数。
 

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号