R语言实战学习笔记-第五章 高级数据管理
本章内容
数学和统计函数字符处理函数
循环和条件执行
自编函数
数据整合与重塑
5.1 一个数据处理难题
5.2 数值和字符处理函数
5.2.3 概率函数
5.2.4 字符处理函数
5.2.5其他实用函数
5.2.6 将函数应用于矩阵和数据框
5.3 数据处理难题的一套解决方案
5.1节中提出的问题是:将学生的各科考试成绩组合为单一的成绩衡量指标,基于相对名次
(前20%、下20%、等等)给出从A到F的评分,根据学生姓氏和名字的首字母对花名册进行排序
options(digits=2)#限定了输出小数点后数字
Student <- c("John Davis", "Angela Williams", "Bullwinkle Moose",
"David Jones", "Janice Markhammer", "Cheryl Cushing",
"Reuven Ytzrhak", "Greg Knox", "Joel England",
"Mary Rayburn")
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(.8,.6,.4,.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)
#sapply()提取列表元素
#"["是一个可以提取某个对象的一部分的函数——在这里它是用来提取列表name各成分中的第一个或第二个元素的
Firstname <- sapply(name, "[",1)
roster <- cbind(Firstname,Lastname,roster[,-1])#[,-1]指删除第一列
roster[order(Lastname,Firstname),]
原始数据
roster
Student Math Science English
1 John Davis 502 95 25
2 Angela Williams 600 99 22
3 Bullwinkle Moose 412 80 18
4 David Jones 358 82 15
5 Janice Markhammer 495 75 20
6 Cheryl Cushing 512 85 28
7 Reuven Ytzrhak 410 80 15
8 Greg Knox 625 95 30
9 Joel England 573 89 27
10 Mary Rayburn 522 86 18
结果:roster[order(Lastname,Firstname),]
Firstname Lastname Math Science English score grade
6 Cheryl Cushing 512 85 28 0.35 C
1 John Davis 502 95 25 0.56 B
9 Joel England 573 89 27 0.70 B
4 David Jones 358 82 15 -1.16 F
8 Greg Knox 625 95 30 1.34 A
5 Janice Markhammer 495 75 20 -0.63 D
3 Bullwinkle Moose 412 80 18 -0.86 D
10 Mary Rayburn 522 86 18 -0.18 C
2 Angela Williams 600 99 22 0.92 A
7 Reuven Ytzrhak 410 80 15 -1.05 F
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 用户自编函数
假设你想编写一个函数,用来计算数据对象的集中趋势和散布情况。此函数应当可以选择性地给出参数统计量(均值和标准差)和非参数统计量(中位数和绝对中位差)。结果应当以一个含名称列表的形式给出。另外,用户应当可以选择是否自动输出结果。除非另外指定,否则此函数的默认行为应当是计算参数统计量并且不输出结果。
mystats <- function(x,parametric= TRUE,print = FALSE){
if(parametric){
center<-mean(x);speard <- sd(x)
}else {
center<- median(x);spread <- mad(x)
}
if(print & parametric){
cat('Mean=',center,'\n','SD=',speard,'\n')
}else if (print & !parametric) {
cat("Median=", center, "\n", "MAD=", spread, "\n")
}
result <- list(center=center,spread = spread)
return(result)
}
set.seed(1234)
x <- rnorm(500)
y <- mystats(x, parametric=FALSE, print=TRUE)
mydate<-function(type="long"){
switch(type,
long=format(Sys.time(),"%A %B %d %Y"),
short=format(Sys.time(),"%m-%d-%y"),
cat(type, "is not a recognized type\n")
)
}
mydate("long")
mydate("short")
> mydate("long")
[1] "星期五 三月 30 2018"
> mydate("short")
[1] "03-30-18"
5.6 整合与重构
转置:t()函数,格式t(matrix)
整合数据:aggregate(x,by,FUN),其中x是待折叠的数据对象,by是一个变量名组成的列表,这些变量将被去除掉以形成新的观测,而FUN则是用来计算描述性统计量的标量函数,它用来计算新观测中的值。
reshape包
library(reshape2)
md <- melt(mydata, id=c("ID", "Time"))
newdata <- dcast(md, formula, fun.aggregate)
其中的md为已融合的数据,formula描述了想要的最后结果,而fun.aggregate是(可选
的)数据整合函数。其接受的公式形如:
rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 + ...
在这一公式中,rowvar1 + rowvar2 + ...定义了要划掉的变量集合,以确定各行的内容,
而colvar1 + colvar2 + ...则定义了要划掉的、确定各列内容的变量集合