本系列是一个新的系列,在此系列中,我将和大家共同学习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)

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

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

得到的结果是

可以对融合后的数据框使用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:函数,流程控制,数据框重塑的更多相关文章

  1. R语言学习 第三篇:数据框

    数据框(data.frame)是最常用的数据结构,用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同数据列的数据类型可以相同,也可以不同,但是每列的行数(长度)必须相同.数据框的每列 ...

  2. R语言数据分析利器data.table包—数据框结构处理精讲

    R语言数据分析利器data.table包-数据框结构处理精讲 R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代 ...

  3. Go语言学习之3 流程控制、函数

    主要内容: 1. strings和strconv使用2. Go中的时间和日期类型3. 指针类型4. 流程控制5. 函数详解 1. strings和strconv使用 //strings . strin ...

  4. R语言数据分析利器data.table包 —— 数据框结构处理精讲

        R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理 ...

  5. R语言学习 第四篇:函数和流程控制

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...

  6. R语言学习笔记之: 论如何正确把EXCEL文件喂给R处理

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html ---- 前言: 应用背景兼吐槽 继续延续之前每个月至少一次更新博客,归纳总结学习心得好习惯. ...

  7. 利用R语言制作出漂亮的交互数据可视化

    利用R语言制作出漂亮的交互数据可视化 利用R语言也可以制作出漂亮的交互数据可视化,下面和大家分享一些常用的交互可视化的R包. rCharts包 说起R语言的交互包,第一个想到的应该就是rCharts包 ...

  8. R语言学习 第九篇:plyr包

    在数据分析中,整理数据的本质可以归纳为:对数据进行分割(Split),然后应用(Apply)某些处理函数,最后将结果重新组合(Combine)成所需的格式返回,简单描述为:Split - Apply ...

  9. R语言学习笔记:向量

    向量是R语言最基本的数据类型. 单个数值(标量)其实没有单独的数据类型,它只不过是只有一个元素的向量. x <- c(1, 2, 4, 9) x <- c(x[1:3], 88, x[4] ...

  10. R语言学习笔记(八):零碎知识点(16-20)

    16--complete.cases( ) complete.case()可以判断对象中是否数据完全,然后返回TRUE, FALSE 这一函数在去除数据框中缺失值时很有用. > d kids a ...

随机推荐

  1. Pytest(12)pytest缓存

    前言 pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例. 方便我们在运行用例的时候加上--lf 和 --ff 参数,快速运行上一 ...

  2. 动态规划TG.lv(1) (洛谷提高历练地)

    动态规划TG.lv(1) P1005 矩阵取数游戏 分析:每行不超过80个数字,直接区间DP即可,\(dp[i][j]\)表示区间\([i,j]\)之间取数可以得到的答案,每次向右或者向左扩展即可.但 ...

  3. 【uva 1617】Laptop(算法效率--贪心,2种理解)

    题意:有N条长度为1的线段,要求使每条线段分别在相应区间,且"空隙"数目最小.输出"空隙"数.(1≤N≤100000) 解法:(P.S.我这题竟做了2个多小时, ...

  4. Panasonic Programming Contest (AtCoder Beginner Contest 186) E.Throne (数学,线性同余方程)

    题意:有围着一圈的\(N\)把椅子,其中有一个是冠位,你在离冠位顺时针\(S\)把椅子的位置,你每次可以顺时针走\(K\)个椅子,问最少要走多少次才能登上冠位,或者走不到冠位. 题解:这题和洛谷那个青 ...

  5. Codeforces Round #666 (Div. 2) C. Multiples of Length (构造,贪心)

    题意:有一个长度为\(n\)的序列,可以操作\(3\)次,每次选取一段区间,然后区间的元素加减区间长度的倍数,\(3\)次操作后使得序列所有元素为\(0\),问具体操作情况. 题解:假如我们能选择一整 ...

  6. Educational Codeforces Round 91 (Rated for Div. 2) C. Create The Teams (模拟)

    题意:有\(n\)个队员,每个队友都有一个能力值,构造队伍,要求队伍人数*队伍中最低能力值不小于\(x\),求能构造的最大队伍数. 题解:大水题,排个序,倒着模拟就行了. 代码: int t; int ...

  7. UWP(二)调用Win32程序

    目录 一.如何构建Win32程序 二.如何构建UWP工程? 三.Samples 一.如何构建Win32程序 打开csproj文件,使用如下代码添加引用(Reference).注意,如果指定位置不存在, ...

  8. Shell 信号处理 & Expect 免交互

    监控脚本项目 信号处理 1 什么是信号 由键盘组合键或者 kill 命令发出操作称之为信号 信号是发送给进程的,进程在收到信号后会作出默认的响应 2 为何要在进程内处理信号 进程在收到信号后会有默认的 ...

  9. woj1005-holding animals-01pack woj1006-Language of animals-BFS

    title: woj1005-holding animals-01pack date: 2020-03-05 categories: acm tags: [acm,woj,pack] 01背包.中等题 ...

  10. codeforces 14D(搜索+求树的直径模板)

    D. Two Paths time limit per test 2 seconds memory limit per test 64 megabytes input standard input o ...