主要内容:1.数字和统计函数 2.字符处理函数 3.循环和条件执行 4.自编函数 5.数据整合与重塑
5.1一个数据处理难题
要比较三科考试成绩,需要将其变换为可比较的单元。
5.2数值和字符处理函数
5.2.1数字函数
常用的数字函数和简短的用例
5.2.2统计函数
例如:均值和标准差的计算
- y<-mean(x) #对象x中的元素求算术平均数
- z<-mean(x,trim=0.05,na.rm=TRUE)#丢弃最大5%和最小5%的数据和所缺失值后的算数平均数
#简洁版
> x <- c(1,2,3,4,5,6,7,8)
> mean(x)
[1] 4.5
> sd(x)
[1] 2.44949
#冗余版
> n<-length(x)
> meanx<-sum(x)/n
> css<-sum((x-meanx)^2)
> sdx<-sqrt(css/(n-1))
> meanx
[1] 4.5
> sdx
[1] 2.44949
数据的标准化
- 函数scale()对矩阵或者数据框的指定列进行均值为0,标准差为1的标准化:
newdata<-scale(mydata)
- 要对每一列进行任意均值和标准差的标准化,可以使用如下代码:
newdata<-scale(mydata)*SD+M #M是均值,SD是想要的标准差
- 对指定列而不是整个矩阵或者数据框进行标准化:
newdata<-transform(mydata,myvar=scale(myvar)*10+50) #将变量myvar标准化为均值50,标准差为10的变量
5.2.3概率函数
概率函数通常用来生成特征已知的模拟数据,以及在用户编写的统计函数中计算概率值
1.设定随机数种子
每次生成伪随机数的时候,函数会使用一个不同的种子,产生不同的种子
set.seed()显式指定这个种子,runif()用来生成0到1区间上服从均匀分布的伪随机数
#生成服从正太分布的伪随机数
> runif(5)
[1] 0.7313437 0.5349671 0.1996987 0.9950725 0.6437553
> runif(5)
[1] 0.7102307 0.6053098 0.5592371 0.3511297 0.3563968
> 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
2.生成多元正态数据
需要获取来自给定均值向量和协方差阵的多元正太分布数据
调用MASS包中的mvrnorm()函数:mvnorm(n,mean,sigma)#n:想要样本的大小,mean为均值向量,sigma是方差-协方差矩阵
> 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)
> madata<-mvrnorm(500,mean,sigma)#生成数据
> mydata<-as.data.frame(mydata)
> names(mydata)<-c("y","x1","x2")
> dim(mydata)#查看结果
[1] 4 4
>
> head(mydata,n=10)
y x1 x2 NA
1 2 3 5 2.5
2 2 4 6 3.0
3 6 2 8 4.0
4 4 8 12 6.0
5.2.4字符串处理函数
5.2.5其他使用函数
5.2.6将函数应用于矩阵和数据框
#将函数应用于数据对象
> a<-5
> sqrt(a)
[1] 2.24
> b<-c(1.243,5.654,2.99)
> round(b)
[1] 1 6 3
> c<-matrix(runif(12),nrow=3)
> c
[,1] [,2] [,3] [,4]
[1,] 0.9636 0.216 0.289 0.913
[2,] 0.2068 0.240 0.804 0.353
[3,] 0.0862 0.197 0.378 0.931
> log(c)
[,1] [,2] [,3] [,4]
[1,] -0.0371 -1.53 -1.241 -0.0912
[2,] -1.5762 -1.43 -0.218 -1.0402
[3,] -2.4511 -1.62 -0.972 -0.0710
> mean(c)
[1] 0.465
- apply()函数,可将一个任意函数“应用”到矩阵,数组,数据框的任何维度上
- apply()函数的使用格式为:apply(x,MARGIN,FUN,...)#x:数据对象,MARGIN是维度的下标,FUN是自定义的函数,后面...是任意想传递给FUN的参数
> mydata<-matrix(rnom(30),nrow=6)#生成数据
> mydata<-matrix(rnorm(30),nrow=6)
> mydata
[,1] [,2] [,3] [,4] [,5]
[1,] 0.459 1.203 1.234 0.591 -0.281
[2,] -1.261 0.769 -1.891 -0.435 0.812
[3,] -0.527 0.238 -0.223 -0.251 -0.208
[4,] -0.557 -1.415 0.768 -0.926 1.451
[5,] -0.374 2.934 0.388 1.087 0.841
[6,] -0.604 0.935 0.609 -1.944 -0.866
> apply(mydata,1,mean)#计算每行的均值
[1] 0.641 -0.401 -0.194 -0.136 0.975 -0.374
> apply(mydata,2,mean)#计算每列的均值
[1] -0.478 0.777 0.148 -0.313 0.292
> apply(mydata,2,mean,trim=0.2)#计算每行的截尾均值
[1] -0.516 0.786 0.386 -0.255 0.291
5.3数据处理难题的一套解决方案
#示例的一种解决方案
> options(digits=2)
> Student<-c("xiao yi","xiao er","xiao san","xiao si","xiao wu","xiao liu","xiao qi","xiao ba","xiao jiu","xiao shi")
> 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=FALSE)
#计算综合得分
> z<-scale(roster[,2:4])
> score<-apply(z,1,mean)
> roster<-cbind(roster,score)
#对学生评分
> y<-quantile(score,c(0.8,0.6,0.4,0.2))
> roster$grade[score>=y[1]]<-"A"
> roster$grade[score<y[1]&score>=y[2]]<-"B"
> roster$grade[score<y[2]&score>=y[3]]<-"C"
> roster$grade[score<y[3]&score>=y[4]]<-"D"
> roster$grade[score<y[4]]<-"F"
#抽取姓氏和名字
> name<-strsplit((roster$Student)," ")
> Lastname<-sapply(name,"[",2)
> Firstname<-sapply(name,"[",1)
> roster<-cbind(Firstname,Lastname,roster[,-1])
> roster<-roster[order(Lastname,Firstname),]#根据姓氏和名字排序
> roster
Firstname Lastname Math Science English score grade
8 xiao ba 625 95 30 1.34 C
2 xiao er 600 99 22 0.92 B
9 xiao jiu 573 89 27 0.70 B
6 xiao liu 512 85 28 0.35 F
7 xiao qi 410 80 15 -1.05 A
3 xiao san 412 80 18 -0.86 D
10 xiao shi 522 86 18 -0.18 D
4 xiao si 358 82 15 -1.16 C
5 xiao wu 495 75 20 -0.63 A
1 xiao yi 502 95 25 0.56 F
>
5.4重复和循环
1.for结构
for (var in seq) statement
> for (i in 1:10) print("hello")
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
> #hello被打印10次
2.while结构
while结构循环重复执行一个语句,直到条件部位真为止:while (cond) statement
> i<-10
> while (i>0) {print("hello");i<-i-1}
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
[1] "hello"
>
5.4.2条件执行
1.if-else结构
if (cond)statement
if (cond)statement1 else statement2
2.ifelse结构
ifelse (cond, statement1,statement2)
cond为TRUE,执行第一个语句,cond为FALSE,执行第二个语句
3.switch结构
> feelings<-c("sad","afraid")
> for (i in feelings) print(switch(i,happy="I am glad you are happy",afraid="There is nothing to fear",sad = "cheer up",angry = "Calm down now"))
[1] "cheer up"
[1] "There is nothing to fear"
>
5.5.用户自编函数
一个函数的结构看起来大致:
myfunction<-function(arg1,arg2,...){
statements
return(object)}
5.6重构与整合
整合数据时,往往将多组观测替换为根据这些观测计算的描述性统计量
重塑数据时,通过修改数据的结构(行和列)来决定数据中的组织方式
5.6.1转置
函数t()对一个矩阵或者数据框进行转置
> cars<-mtcars[1:5,1:4]
> cars
mpg cyl disp hp
Mazda RX4 21 6 160 110
Mazda RX4 Wag 21 6 160 110
Datsun 710 23 4 108 93
Hornet 4 Drive 21 6 258 110
Hornet Sportabout 19 8 360 175
> t(cars)
Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout
mpg 21 21 23 21 19
cyl 6 6 4 6 8
disp 160 160 108 258 360
hp 110 110 93 110 175
>
5.6.2整合数据
使用一个或者多个by变量和一个预先定义好的函数折叠数据
aggregate(x, by, FUN) #x是待折叠的数据对象,by是一个变量名组成的列表,这些变量将被去掉以形成新的观测值
#整合数据,by中的变量必须在一个列表中
> options(digits = 3)
> attach(mtcars)
> aggdata<-aggregate(mtcars,by=list(cyl,gear),FUN=mean,na.rm=TRUE)
> aggdata
Group.1 Group.2 mpg cyl disp hp drat wt qsec vs am gear carb
1 4 3 21.5 4 120 97 3.70 2.46 20.0 1.0 0.00 3 1.00
2 6 3 19.8 6 242 108 2.92 3.34 19.8 1.0 0.00 3 1.00
3 8 3 15.1 8 358 194 3.12 4.10 17.1 0.0 0.00 3 3.08
4 4 4 26.9 4 103 76 4.11 2.38 19.6 1.0 0.75 4 1.50
5 6 4 19.8 6 164 116 3.91 3.09 17.7 0.5 0.50 4 4.00
6 4 5 28.2 4 108 102 4.10 1.83 16.8 0.5 1.00 5 2.00
7 6 5 19.7 6 145 175 3.62 2.77 15.5 0.0 1.00 5 6.00
8 8 5 15.4 8 326 300 3.88 3.37 14.6 0.0 1.00 5 6.00
>
5.6.3reshape2包
reshape2包是一套重构和整合数据集的绝妙的万能工具