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

R语言学习4:函数,流程控制,数据框重塑的更多相关文章
- R语言学习 第三篇:数据框
数据框(data.frame)是最常用的数据结构,用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同数据列的数据类型可以相同,也可以不同,但是每列的行数(长度)必须相同.数据框的每列 ...
- R语言数据分析利器data.table包—数据框结构处理精讲
R语言数据分析利器data.table包-数据框结构处理精讲 R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代 ...
- Go语言学习之3 流程控制、函数
主要内容: 1. strings和strconv使用2. Go中的时间和日期类型3. 指针类型4. 流程控制5. 函数详解 1. strings和strconv使用 //strings . strin ...
- R语言数据分析利器data.table包 —— 数据框结构处理精讲
R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理 ...
- R语言学习 第四篇:函数和流程控制
变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...
- R语言学习笔记之: 论如何正确把EXCEL文件喂给R处理
博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html ---- 前言: 应用背景兼吐槽 继续延续之前每个月至少一次更新博客,归纳总结学习心得好习惯. ...
- 利用R语言制作出漂亮的交互数据可视化
利用R语言制作出漂亮的交互数据可视化 利用R语言也可以制作出漂亮的交互数据可视化,下面和大家分享一些常用的交互可视化的R包. rCharts包 说起R语言的交互包,第一个想到的应该就是rCharts包 ...
- R语言学习 第九篇:plyr包
在数据分析中,整理数据的本质可以归纳为:对数据进行分割(Split),然后应用(Apply)某些处理函数,最后将结果重新组合(Combine)成所需的格式返回,简单描述为:Split - Apply ...
- R语言学习笔记:向量
向量是R语言最基本的数据类型. 单个数值(标量)其实没有单独的数据类型,它只不过是只有一个元素的向量. x <- c(1, 2, 4, 9) x <- c(x[1:3], 88, x[4] ...
- R语言学习笔记(八):零碎知识点(16-20)
16--complete.cases( ) complete.case()可以判断对象中是否数据完全,然后返回TRUE, FALSE 这一函数在去除数据框中缺失值时很有用. > d kids a ...
随机推荐
- java封装详解
三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能 ...
- 深入浅出Java线程池:源码篇
前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用.(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适).本文则深入线程池的源码,主要是介绍Thr ...
- Codeforces Round #647 (Div. 2) B. Johnny and His Hobbies(枚举)
题目链接:https://codeforces.com/contest/1362/problem/B 题意 有一个大小及元素值均不超过 $1024$ 的正整数集合,求最小正整数 $k$,使得集合中的每 ...
- 【noi 2.6_9275】&【bzoj 3398】Bullcow(DP){Usaco2009 Feb}
题意:一共有N只牡牛(公牛)和牝牛(母牛),每2只牡牛间至少要有K只牝牛才不会斗殴.问无斗殴发生的方案数. 解法:f[i][j]表示一共i只牛,最后一只是j(0为牝牛,1为牡牛)的方案数.f[i][0 ...
- Codeforces ECR86 C. Yet Another Counting Problem(规律,区间)
题意:给你两个正整数a和b,询问q次,每次给你一个区间[l,r],问[l,r]中有多少数字满足:x%a%b!=a%b%a. 题解:看公式无从下手的题,一般都是要找规律的.首先,我们知道,假如x%a%b ...
- hdu2126 Buy the souvenirs
Problem Description When the winter holiday comes, a lot of people will have a trip. Generally, ther ...
- LINUX - 最简单的CS通信实例
服务端[编译:gcc server.c -o server] #include <stdio.h> #include <sys/socket.h> #include <s ...
- ArcGIS处理栅格数据(三)
六.制作镶嵌数据集(栅格数据集优点:a.浏览速度快:b.入库速度快:c.可指定区域显示) 1.右键目录中的数据库,新建"镶嵌数据集". 2.添加栅格数据. 3.定义金字塔. 4.构 ...
- Leetcode(106)-从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7 ...
- Gym 101170I Iron and Coal(BFS + 思维)题解
题意:有一个有向图,有些点是煤,有些点是铁,但不会同时有铁和煤.现在我要从1出发,占领可以到达的点.问最少占领几个点能同时拥有一个煤和一个铁(1不用占领). 思路:思路很秀啊.我们从1往外bfs,得到 ...