《R语言实战》第五章 高级数据管理

主要内容: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包是一套重构和整合数据集的绝妙的万能工具

猜你喜欢

转载自blog.csdn.net/lurong66/article/details/88074393