本文对应《R语言实战》第4章:基本数据管理;第5章:高级数据管理
创建新变量
#建议采用transform()函数 mydata <- transform(mydata, sumx = x1 + x2, meanx = (x1 + x2)/2)
算术运算符
+ |
加 |
- |
减 |
* |
乘 |
/ |
除 |
**或^ |
求幂 |
x%%y |
求余(x mod y)。5%%2的结果为1 |
x%/%y |
整数除法。5%/%2的结果为2 |
重编码
< |
小于 |
<= |
小于或等于 |
> |
大于 |
>= |
大于或等于 |
== |
严格等于(比较浮点类型时慎用,易误判) |
!= |
不等于 |
!x |
非x |
x | y |
x或y |
x & y |
x和y |
isTRUE(x) |
x是否为TRUE |
#较为直观 leadership$agecat[leadership$age > 75] <- “Elder” leadership$agecat[leadership$age >= 55 & leadership$age <= 75] <- “Middle” leadership$agecat[leadership$age < 55] <- “Young” #或者 leadership <- within(leadership, { agecat <- NA agecat[age > 75] <- “Elder” agecat[age >= 55 & age <= 75] <- “Middle” agecat[age < 55] <- “Young” })
重命名
#交互式编辑器编辑变量名 fix(leadership) #reshape包函数rename() library(reshape) leadership <- rename(leadership, c(manager = “managerID”, date = “testDate”)) #names()函数 names(leadership)[6:10] <- c(“item1”, “item2”, “item3”, “item4”, “item5”)
缺失值
缺失值NA(Not Available)不可能出现的值NaN(Not a Number)
#缺失值判定,返回同等大小对象,内容为TRUE或FALSE is.na(object) #缺失值无法比较,不能使用 ”==” 判断
异常值可以重编码为缺失值;分析中排除缺失值可以使用na.omit()函数。
日期值
as.Date(x, “input_format”)
x为日期向量,”input_format”为输入格式
%d |
数字表示的日期 |
01~31 |
%a |
缩写的星期名 |
Mon |
%A |
非缩写的星期名 |
Monday |
%m |
数字表示的月份 |
00~12 |
%b |
缩写的月份 |
Jan |
%B |
非缩写的月份 |
January |
%y |
两位数的年份 |
07 |
%Y |
四位数的年份 |
2007 |
#示例 strDates <- c(“01/05/1965”, “08/16/1975”) dates <- as.Date(strDates, “%m/%d/%Y”)
提示,也可以将日期转换为字符型变量,继续进行字符串的处理
其他日期处理相关的包:lubridate, fCalendar
类型转换
is.numeric() |
as.numeric() |
is.character() |
as.character() |
is.vector() |
as.vector |
is.matrix() |
as.matrix() |
is.data.frame() |
as.data.frame() |
is.factor() |
as.factor |
is.logical() |
as.logical() |
数据排序
order()函数,默认升序
#order()函数示例 newdata <- leadership[order(leadership$gender, -leadership$age), ] #依性别升序和年龄降序排列
数据集合并
添加行:
rbind()函数
total <- rbind(dataframeA, dataframeB)
两个数据框中必须要有相同的变量,顺序可以不相同
如果变量不一致,需要提前处理:删除多余变量;或者追加缺失值
添加列:
不指定公共索引时,可以使用cbind()
指定索引,使用merge()
数据集取子集
一般情况下,可以采用如下代码
newdata <- dataframe[row_indices, colomn_indices]
变量(列)
#保留变量方式: #指明具体列的序号 newdata <- leadership[, c(6:10)] #指明列名称 myvars <- c(“q1”, “q2”, “q3”, “q4”, “q5”) newdata <- leadership[myvars] #剔除变量方式: #指明序号,使用负号剔除 newdata <- leadership[c(-8, -9)] #设为未定义(NULL) leadership$q3 <- leadership$q4 <- NULL #指明列名称 myvars <- names(leadership) %in% c(“q3”, “q4”) newdata <- leadership[!myvars] #解释:names()函数生成包含所有变量名的字符型向量 # %in%将后面的向量以前面的向量为准进行匹配,返回布尔型向量 #翻转后即可实现向量匹配
观测(行)
#指明行序号 newdata <- leadership[1:3, ] #条件筛选 newdata <- leadership[which(leadership$gender == “M”), ]
subset()函数
#两个例子 newdata <- subset(leadership, age >= 35 | age < 24, select = c(q1, q2, q3, q4)) newdata <- subset(leadership, gender == “M” & age > 25, select = gender : q4)
随机抽样
mysample <- leadership[sample(1:nrow(leadership), 3, replace = FALSE), ]
更多抽样方法将在后面作详细介绍
SQL语句操作数据框
package sqldf
数值和字符处理
数学函数
abs(x) |
绝对值 |
sqrt(x) |
平方根 |
ceiling(x) |
向上取整 |
floor(x) |
向下取整 |
trunc(x) |
向0取整 |
round(x, digits = n) |
将x舍入为指定位小数 |
signif(x, digits = n) |
将x舍入为指定位有效数字 |
cos(x), sin(x), tan(x) |
余弦正弦正切 |
acos(x), asin(x), atan(x) |
反余弦反正弦反正切 |
cosh(x), sinh(x), tanh(x) |
双曲余弦双曲正弦双曲正切 |
acosh(x), asinh(x), atanh(x) |
反双曲余弦反双曲正弦反双曲正切 |
exp(x) |
自然为底的指数函数 |
log(x, base = n) log(x) log10(x) |
n为底的对数 log(x)为自然对数 log10(x)为常用对数 |
统计函数
mean(x) |
平均数(声明里trim = 0.05表示丢弃最大最小的5%数据后的平均数) |
median(x) |
中位数 |
sd(x) |
标准差 |
var(x) |
方差 |
mad(x) |
绝对中位数 |
quantile(x, probs) |
分位数 |
range(x) |
值域 |
sum(x) |
求和 |
diff(x, lag = n) |
滞后差分,lag指定滞后几项,默认1 x <- c(1, 5, 23, 29) diff(x)返回c(4, 18, 6) |
min(x) |
最小值 |
max(x) |
最大值 |
scale(x, center = TRUE, scale = TRUE) |
为数据对象x按列进行中心化(center = TRUE)或标准化(center = TRUE, scale = TRUE) |
关于scale()函数的说明:
默认情况下,该函数对矩阵或数据框的指定列进行均值为0,方差为1的标准化:
newdata <- scale(mydata)
要进行指定均值和方差,使用以下语句
newdata <- scale(mydata) * SD + M
对指定列进行标准化:
newdata <- transform(mydata, myvar = scale(myvar) * SD + M)
概率函数
形如
[dpqr]分布缩写
d = 密度函数(density)
p = 分布函数(distribution function)
q = 分位数函数(quantile function)
r = 生成随机数(随机偏差)
分布名称 |
缩写 |
分布名称 |
缩写 |
Beta分布 |
beta |
Logistic分布 |
logis |
二项分布 |
binom |
多项分布 |
multinom |
柯西分布 |
cauchy |
负二项分布 |
nbinom |
(非中心)卡方分布 |
chisq |
正态分布 |
norm |
指数分布 |
exp |
泊松分布 |
pois |
F分布 |
f |
Wilcoxon符号秩分布 |
signrank |
Gamma分布 |
gamma |
t分布 |
t |
几何分布 |
geom |
均匀分布 |
unif |
超几何分布 |
hyper |
Weibull分布 |
weibull |
对数正态分布 |
lnorm |
Wilcoxon秩和分布 |
wilcox |
如密度函数dnorm, 分布函数pnorm, 分位数函数qnorm, 随机数生成函数rnorm
设定随机数种子:使结果可以复现
set.seed(n)
生成多元正态数据:给定均值向量和协方差矩阵的数据集
library(MASS) mvrnorm(n, mean, sigma)
字符处理函数
nchar(x) |
计算x中字符数量 |
substr(x, start, stop) |
提取或替换一个字符向量中的子串 substr(“abcdef”, 2, 4)#返回”bcd” (substr(“abcdef”, 2, 4) <- “22222”)#返回”a222ef” |
grep(pattern, x, ignore.case = FALSE, fixed = FALSE) |
在x中搜索某种模式。fixed = FALSE, pattern为正则表达式,fixed = TRUE, pattern为文本字符串 返回值为匹配的下标 |
sub(pattern, replacement, x, ignore.case = FALSE, fixed = FALSE) |
在x中搜索pattern, 并用replacement替换 |
strsplit(x, split, fixed = FALSE) |
在split处分割x |
paste(… , sep = “”) |
连接字符串,分隔符为sep |
toupper(x) |
大写转换 |
tolower(x) |
小写转换 |
函数grep(), sub()和strsplit()能够搜索文本字符串(fixed = TRUE)或者正则表达式(fixed = FALSE, 默认值)
正则表达式用法,参考https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
其他实用函数
length(x) |
返回对象x的长度 |
seq(from, to, by) |
生成一个序列 seq(1, 10, 2)#c(1, 3, 5, 7, 9) |
rep(x, n) |
将x重复n次 |
cut(x, n) |
将连续型变量x分割为有着n个水平的因子 |
pretty(x, n) |
创建美观的分割点。选取n+1个点,将x分割为n个区间,绘图常用 |
cat(…, file = “myfile”, append = FALSE) |
连接…中的对象,并将其输出到屏幕上或文件中 |
将函数应用于矩阵和数据框
apply族函数,详细应用方式在另一本书中,到时补充吧
一般用法:
apply(x, MARGIN, FUN, …)
MARGIN = 1 表示应用到行,MARGIN = 2表示应用到列
控制流
循环:
for (var in seq) statement while (cond) statement |
只要可能,尽量应用apply族函数,避免循环语句
条件执行:
#if-else结构 if (cond) statement1 else statement2 #ifelse结构:程序行为是二元或输入输出均为向量,尽量使用本结构 ifelse(cond, statement1, statement2) #switch结构 switch(expr, …)
自编函数
自编函数的一些注意事项,在Google’s R Style Guide (https://google.github.io/styleguide/Rguide.xml) 中提到,详情可直接参考网页
整合与重构
转置
#对矩阵或数据框进行转置 t()
整合数据
使用一个或多个变量,一个预先定义好的函数,对数据进行折叠(collapse)
aggregate(x, by, FUN)
#示例 attach(mtcars) aggdata <- aggregate(mtcars, by = list(cyl, gear), FUN = mean, na.rm = TRUE) #返回根据cyl, gear为组合的组为观测,各个变量的均值
reshape包(reshape2包)
融合与重铸
#融合,使每一行都是一个唯一的标识符-变量组合 library(reshape) md <- melt(mydata, id = (c(“id”, “time”))) #重铸 newdata <- cast(md, formula, FUN) #formula形式:rowvar1 + rowvar2 + … ~ colvar1 + colvar2 + … #左边为观测分组(行),右边为变量分组(列)