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 ...
随机推荐
- Pytest(12)pytest缓存
前言 pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例. 方便我们在运行用例的时候加上--lf 和 --ff 参数,快速运行上一 ...
- 动态规划TG.lv(1) (洛谷提高历练地)
动态规划TG.lv(1) P1005 矩阵取数游戏 分析:每行不超过80个数字,直接区间DP即可,\(dp[i][j]\)表示区间\([i,j]\)之间取数可以得到的答案,每次向右或者向左扩展即可.但 ...
- 【uva 1617】Laptop(算法效率--贪心,2种理解)
题意:有N条长度为1的线段,要求使每条线段分别在相应区间,且"空隙"数目最小.输出"空隙"数.(1≤N≤100000) 解法:(P.S.我这题竟做了2个多小时, ...
- Panasonic Programming Contest (AtCoder Beginner Contest 186) E.Throne (数学,线性同余方程)
题意:有围着一圈的\(N\)把椅子,其中有一个是冠位,你在离冠位顺时针\(S\)把椅子的位置,你每次可以顺时针走\(K\)个椅子,问最少要走多少次才能登上冠位,或者走不到冠位. 题解:这题和洛谷那个青 ...
- Codeforces Round #666 (Div. 2) C. Multiples of Length (构造,贪心)
题意:有一个长度为\(n\)的序列,可以操作\(3\)次,每次选取一段区间,然后区间的元素加减区间长度的倍数,\(3\)次操作后使得序列所有元素为\(0\),问具体操作情况. 题解:假如我们能选择一整 ...
- Educational Codeforces Round 91 (Rated for Div. 2) C. Create The Teams (模拟)
题意:有\(n\)个队员,每个队友都有一个能力值,构造队伍,要求队伍人数*队伍中最低能力值不小于\(x\),求能构造的最大队伍数. 题解:大水题,排个序,倒着模拟就行了. 代码: int t; int ...
- UWP(二)调用Win32程序
目录 一.如何构建Win32程序 二.如何构建UWP工程? 三.Samples 一.如何构建Win32程序 打开csproj文件,使用如下代码添加引用(Reference).注意,如果指定位置不存在, ...
- Shell 信号处理 & Expect 免交互
监控脚本项目 信号处理 1 什么是信号 由键盘组合键或者 kill 命令发出操作称之为信号 信号是发送给进程的,进程在收到信号后会作出默认的响应 2 为何要在进程内处理信号 进程在收到信号后会有默认的 ...
- 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背包.中等题 ...
- codeforces 14D(搜索+求树的直径模板)
D. Two Paths time limit per test 2 seconds memory limit per test 64 megabytes input standard input o ...