第五章:高级数据管理
5.2数值和字符处理函数
? 数学函数 ceiling(x) floor(x) trunc(x) ? 统计函数 mad(x) quantile(x,probs) range(x) 绝对中位差 分位数 值域 diff(x,lag=n) 滞后差分 scale(x,center=TRUE, 为数据对象x进行中scale=TRUE) 心化或标准化处理 不小于x的最小整数 round(x,digits=n) 不大于x的最大整数 signif(x,digits=n) 去尾取整 log(x,base=n) 四舍五入,保留n位 指定位数的有效数字 对x取底为n的对数 ? 概率函数 代码:设定随机数种子
> runif(5) #生成0到1区间上服从均匀分布的伪随机数 [1] 0.18866859 0.37082322 0.01029355 0.73821923 0.42429211 > runif(5)
[1] 0.571422300 0.455645452 0.398581830 0.002924141 0.238183502 > set.seed(1234) #显式指定伪随机数种子 > runif(5)
[1] 0.1137034 0.6222994 0.6092747 0.6233794 0.8609154 > set.seed(1234) > runif(5)
[1] 0.1137034 0.6222994 0.6092747 0.6233794 0.8609154 代码:生成多元正态数据 > install.packages(\> library(MASS) > options(digits=3) > set.seed(1234)
> mean=c(230.7,146.7,3.6)
> sigma=matrix(c(15360.8,6721.2,-47.1,6721.2,4700.9,-16.5, -47.1,-16.5,0.3),nrow=3,ncol=3) > mydata<-mvrnorm(500,mean,sigma) > mydata<-as.data.frame(mydata) > names(mydata)<-c(\? 字符处理函数 nchar(x) substr(x,start,stop) grep(pattern,x,ignore, case=F,fixed=ForT) toupper(x) ? 其他函数 length(x) seq(from,to,by) rep(x,n) x的长度 生成一个序列 将x重复n次 cut(x,n) pretty(x,n) 将x分割为n个因子 创建美观的分割点 计算x中的字符数量 sub(pattern,replacement, 在x中搜索文本并进x,ignore,case=F,fixed=F) 行替换 替换向量中的子串 在x中搜索某种模式,返回正则表达式或下标 strsplit(x,split,fixed=F) paste(…,seq=””) tolower(x) 分割字符向量x的元素 连接字符转,分隔符为seq 大写转换 小写转换 cat(…,file=””,append=F) 连接…中的对象并输出 ? \\n表示新行,\\t为制表符,\\’为单引号,\\b为退格 ? 函数apply(),调用格式:apply(x,MARGIN,FUN,…),MARGEN=1表示行,2为列
5.3数据处理难题的一套解决方案
代码:将学生的各科考试成绩组合为单一的成绩衡量指标,给予相对名次给出从A到F的评分,根据学生的姓氏和名字的首字母对花名册进行排序。 > options(digits=2)
> student<-c(\
Markhammer\England\
> math<-c(502,600,412,358,495,512,410,625,573,522) > science<-c(95,99,80,82,75,85,80,95,89,86) > english<-c(25,22,18,15,20,28,15,30,27,18)
> roster<-data.frame(student,math,science,english,stringsAsFactors=F) > z<-scale(roster[,2:4]) > score<-apply(z,1,mean) > roster<-cbind(roster,score) > y<-quantile(score,c(.8,.6,.4,.2)) > roster$grade[score>=y[1]]<-\
> roster$grade[score
> roster<-cbind(firstname,lastname,roster[,-1]) > roster<-roster[order(lastname,firstname),] > roster
5.4控制流
5.4.1重复和循环 ? for结构
for(var in seq) statement 例:for(i in 1:10) print(“Hello”) ? while结构
while(cond) statement 例:i<-10 while(i>0) {print(“Hello”;i<-i-1)} 5.4.2条件执行 ? if-else结构
if(cond) statement
if(cond) statement1 else statement2 ? ifelse结构
ifelse(cond,statement1,statement2),若cond为TRUE,则执行第一个语句,否则执行第二个
? switch结构
swich(expr,…),…表示与expr的各种可能输出值绑定的语句
5.5用户自编函数
? 一个函数的大概结构:
myfunction<-function(arg1,arg2,…){ statement return(object) }
代码:一个描述性统计量计算函数
> mystats<-function(x,parametric=TRUE,print=FALSE){ if(parametric){
center<-mean(x);spread<-sd(x) }else{
center<-median(x);spread<-mad(x) }
if(print¶metric){
cat(\}else if(print&!parametric){
cat(\}
result<-list(center=center,spread=spread) return(result) }
> set.seed(1234) > x<-rnorm(500) > y<-mystats(x) > y
5.6整合与重构
? 转置:t()函数,格式t(matrix)
? 整合数据:aggregate(x,by,FUN),其中x是待折叠的数据对象,by是一个变量名组成的
列表,这些变量将被去除掉以形成新的观测,而FUN则是用来计算描述性统计量的标量函数,它用来计算新观测中的值。 ? reshape包
原始数据集
ID 1 1 2 2
TIME 1 2 1 2
X1 5 3 6 2
X2 6 5 1 4
数据集的融合是将它重构为这样一种格式:每个测量(最后两列的值)变量独占一行,行中带有要唯一确定这个测量所需的标识符变量(ID,TIME以及观测属于X1还是X2)。
>library(reshape)
>md<-melt(mydata,id=(c(“id”,”time”)))
融合后的数据集 ID 1 1 2
TIME 1 2 1
变量 X1 X1 X1
值 5 3 6
ID 2 1 1 2 2 TIME 2 1 2 1 2 变量 X1 X2 X2 X2 X2 值 2 6 5 1 4
数据集的重铸,cast()函数,调用函数newdata<-cast(md,formula,FUN),其中md为已融合的数据,formula描述了最后想要的结果,FUN是数据整合函数,其接受公式形如:
rowvar1+rowvar2+… ~ colvar1+colvar2+…
在这个公式中,前者定义了要换掉的变量集合,以确定各行的内容,后者定义了要划掉的,确定各列内容的变量集合。

