在基本数据管理中主要学习了数据框(data.frame)的基本操作,主要包括:简单数据文件读入、创建/删除变量(列)、行列的重命名、变量重编码、NA值简单处理、数据选取等。
本节主要介绍一些数学统计函数和字符处理函数、数据整合与重塑等。
1、数学统计函数和字符处理函数
R中常用的数学函数如下,这些函数都具有广播性:
函数 | 描述 |
---|---|
abs(x) | 取绝对值 |
sqrt(x) | 取平方根 |
ceiling(x) | 不小于x的最小整数,如ceiling(3.5)返回4 |
floor(x) | 不大于x的最大整数,floor(3.5)返回3 |
trunc(x) | 取整数部分,如trunc(3.5)返回3 |
round(x, digits=n) | 四入五入到指定位数,如round(3.458, digits=2)返回值为3.46 |
signif(x, digits=n) | 四舍五入到指定有效数字位数,如signif(3.458, digits=2)返回值3.5 |
cos(x)、sin(x)、tan(x)、acos(x)、asin(x)、atan(x)、cosh(x)、sinh(x)、acosh(h)等 | 三角函数 |
log(x, base=n) | 以n为底对x取对数,其中log(x)为自然对数,log10(x)为常用对数 |
exp(x) | 以e为底的指数函数 |
常用统计函数如下所示,其中大部分函数都拥有重要参数,如mean(x,trim=0.05,na.rm=TRUE)
表示去除首尾5%极值和所有缺失值后的算术平均数。使用?func
可查看相应函数用法。
函数 | 描述 |
---|---|
mean(x) | 求平均数 |
median(x) | 中位数 |
sd(x) | 标准差 |
var(x) | 方差 |
mad(x) | 绝对中位差(median absolute deviation) |
quantile(x, probs) | 求分位数。其中x为代求分位数的数值型向量,probs为[0,1]间的概率值组成的数值向量,如quantile(x, c(0.3,0.8)) |
range(x) | 求值域 |
sum(x) | 求和 |
diff(x, lag=n) | 滞后差分,lag指定滞后几项,默认为1 |
min(x) | 最小值 |
max(x) | 最大值 |
scale(x, center=TRUE, scale=TRUE) | 为数据对象按列进行中心化(center=TRUE)或标准化(center=TRUE, scale=TRUE) |
默认情况下 ,函数scale()对矩阵或数据框的指定列进行均值为0,标准差为1的标准化。下面的例子简单展示了scale的用法。
> student <- c('andy','lucy','mike','jacky');score <- c(88,92,67,75);df<-data.frame(student,score);df
student score
1 andy 88
2 lucy 92
3 mike 67
4 jacky 75
> scale(df$score)
[,1]
[1,] 0.6487087
[2,] 0.9946866
[3,] -1.1676756
[4,] -0.4757197
attr(,"scaled:center")
[1] 80.5
attr(,"scaled:scale")
[1] 11.56143
# 要进行任意均值和标准差的标准化,可用 scale(x)*SD + M, 其中SD表示标准差,M表示均值
> df <- transform(df, scale_score=scale(score)*10+50);df
student score scale_score
1 andy 88 56.48709
2 lucy 92 59.94687
3 mike 67 38.32324
4 jacky 75 45.24280
概率分布函数暂时还不太懂。下面是字符处理函数。
函数 | 描述 |
---|---|
nchar(x) | 计算x中的字符数量 |
substr(x, start, stop) | 提取或替换一个字符向量的子串 |
grep(pattern, x, ignore.case=FALSE, fixed=FALSE) | 在x中搜索某种模式。fixed=FALSE时表示pattern使用正则表达式,否则pattern仅表示字符串。返回值为匹配的下标 |
sub(pattern, replacement, x, ignore.case=FALSE, fixed=FALSE) | 在x中搜索pattern,并以replacement将其替换。fixed用法与grep相同 |
strsplit(x, split, fixed=FALSE) | 以split为分隔符分割x,返回一个列表 |
paste(...,sep="") | 以sep为连接符连接字符串 |
toupper(x) | 转换为大写 |
tolower(x) | 转换为小写 |
其他一些常用函数
函数 | 描述 |
---|---|
length(x) | x长度 |
seq(from, to, by) | 生成一个序列 |
rep(x, n) | 生成一个x重复n次的向量 |
cut(x, n) | 将连续型变量x分割为有着n个水平的因子,使用ordered_result=TRUE以创建一个有序型因子 |
pretty(x ,n) | 创建美观的分割点。通过选取n+1个等间距的取整值,将一个连续型变量x分割为n个区间。绘图常用 |
cat(..., file="filename", append=FALSE) | 连接...中的对象,并将其输出到屏幕上或文件中(如果声明了的话) |
2、一个数据处理的例子
现有一些学生成绩,需要对其做出整理做出一个综合排序。例子来自R语言实战。
##### 生成数据
> math <- c(500,600,450,465,550,530,487,568,350,400)
> science <- c(90,98,95,86,84,99,75,80,76,74)
> english <- c(25,20,18,12,23,15,22,13,30,17)
> student<-c('john davis', 'angela willam', 'bull moose', 'david jones', 'janice mark', 'chery cushing', 'riven yark', 'greg knox', 'joel england', 'olaf halen')
> df <- data.frame(student, math, science, english, stringsAsFactors=FALSE);df
student math science english
1 john davis 500 90 25
2 angela willam 600 98 20
3 bull moose 450 95 18
4 david jones 465 86 12
5 janice mark 550 84 23
6 chery cushing 530 99 15
7 riven yark 487 75 22
8 greg knox 568 80 13
9 joel england 350 76 30
10 olaf halen 400 74 17
######由于各科成绩的总分不同,将其标准化便于比较
> z <- scale(df[c(2:4)])
######取标准化后各科成绩的平均值作为每个学生的综合成绩
> options(digits=2);df$score <- apply(z, 1, mean);df
student math science english score
1 john davis 500 90 25 0.519
2 angela willam 600 98 20 0.937
3 bull moose 450 95 18 0.064
4 david jones 465 86 12 -0.541
5 janice mark 550 84 23 0.407
6 chery cushing 530 99 15 0.373
7 riven yark 487 75 22 -0.240
8 greg knox 568 80 13 -0.246
9 joel england 350 76 30 -0.325
10 olaf halen 400 74 17 -0.947
#####新增变量grade使用ABCDF来表示成绩,即重编码
> df$grade[df$score>=y[4]] <- 'A';df$grade[df$score=y[3]]<-'B';df$grade[df$score>=y[2] & df$score=y[1]]<-'D';df$grade[df$score name <- strsplit(df$student, " ")
> name
[[1]]
[1] "john" "davis"
[[2]]
[1] "angela" "willam"
[[3]]
[1] "bull" "moose"
[[4]]
[1] "david" "jones"
[[5]]
[1] "janice" "mark"
[[6]]
[1] "chery" "cushing"
[[7]]
[1] "riven" "yark"
[[8]]
[1] "greg" "knox"
[[9]]
[1] "joel" "england"
[[10]]
[1] "olaf" "halen"
#####将姓和名分别赋值给一个向量,然后将这两个向量合并到数据框中
> lastname<-sapply(name, '[', 2); firstname<-sapply(name,'[',1);df<- cbind(firstname,lastname,df[,-1]);df
firstname lastname math science english score grade
1 john davis 500 90 25 0.519 A
2 angela willam 600 98 20 0.937 A
3 bull moose 450 95 18 0.064 C
4 david jones 465 86 12 -0.541 F
5 janice mark 550 84 23 0.407 B
6 chery cushing 530 99 15 0.373 B
7 riven yark 487 75 22 -0.240 C
8 greg knox 568 80 13 -0.246 D
9 joel england 350 76 30 -0.325 D
10 olaf halen 400 74 17 -0.947 F
#####使用firstname和lastname这两项进行排序
> df<-df[order(firstname,lastname),];df
firstname lastname math science english score grade
2 angela willam 600 98 20 0.937 A
3 bull moose 450 95 18 0.064 C
6 chery cushing 530 99 15 0.373 B
4 david jones 465 86 12 -0.541 F
8 greg knox 568 80 13 -0.246 D
5 janice mark 550 84 23 0.407 B
9 joel england 350 76 30 -0.325 D
1 john davis 500 90 25 0.519 A
10 olaf halen 400 74 17 -0.947 F
7 riven yark 487 75 22 -0.240 C
3、数据整合与重构
使用函数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
使用R内置函数aggregate(x ,by, FUN)
可以对数据进行折叠(collapse,相当于分组,python pandas中groupby,FUN相当于groupby后进行的处理函数)。by是一个变量名组成的列表(必须是列表),还可以为分组变量声明自定义的名称。FUN表示对每一个分组内的数据进行的处理方式。
> 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
> aggdata <- aggregate(mtcars, by=list(Group.cyl=cyl,Group.gear=gear),FUN=mean,na.rm=TRUE); aggdata
Group.cyl Group.gear 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
#####在这里mean表示对每一个组内的数据去平均值,如分组(cyl=4, gear=3)所对应的所有的mpg的均值为21.5
aggregate
可以对数据进行简单的整合,但要进行更复杂的重构,可以使用reshape2包,但reshape2较难以理解。
参考:
R语言实战.