R语言实战-第五章 R in action-chapter5

#第五章
#数值和字符处理函数

#数学函数
abs(-5)#绝对值
sqrt(36)#开平方
ceiling(3.1)#向上取整
floor(4.6)#向下取整
trunc(3.6)#向0方向截取的x整数部分
round(5.68888,digits=3)#指定位数小数
signif(5.68888,digits=3)#指定有效位数
#余弦
cos(3.1415926/3)
sin(3.1415926/2)
tan(3.1415926/4)
#反余弦
acos(0.5)
asin(1)
atan(1)

log(25,base=5)#对25取5为底的对数
log(10000)#自然对数
log10(10000)#10为底的对数
exp(2.3026)#指数函数


#统计函数
xx <- c(25,26,27,28)
yy <- c(25,26,37,28,20,29,41)
mean(xx)#均值
median(yy)#中位数
sd(xx)#标准差
var(yy)#方差
mad(xx)#绝对中位差
#给定一个数据样本集,首先求其中位数,
#然后求原始数据减去中位数的绝对值从而形成一个新的数据样本,
#再求新的数据样本的中位数即为绝对中位差。

quantile(xx,c(0.25,0.5))#分位数,求xx的25%和50%的分位数
range(yy)#求域值
sum(xx)#求和
diff(yy,lag = 2)#滞后差分,lag用以指定滞后几项,默认lag=1
min(xx)#最小值
max(yy)#最大值
scale(yy,center = TRUE,scale = TRUE)#中心化(center = TRUE)或标准化(center = TRUE,scale = TRUE)
#标准化后数据均值为0,标准差为1
newyy <- scale(yy)
mean(newyy)
sd(newyy)
#对每一列进行任意均值M和标准差SD的标准化代码如下
#newdata <- scale(data)*SD+M
#practice
newyy1 <- scale(yy)*2+1
mean(newyy1)
sd(newyy1)
#对指定列而不是整个矩阵或数据框进行标准化,代码如下
#newdata <- transform(mydata,myvar = scale(myvar)*SD+M)
#practice
mydata <- data.frame(name=c("sunny","jazzy","bill","ben"),
                    age=c(25,22,12,27),
                    height=c(171,154,182,163),
                    sex=c("F","M","F","F"))
str(mydata)
newdata <- transform(mydata,height = scale(height)*2+3)
mean(newdata$height)
sd(newdata$height)

#概率函数
#dpqr:d密度函数 p分布函数 q分位数函数 r生成随机数

#在区间[-3,3]上绘制标准正态曲线
x<- pretty(c(-3,3),30)
y <- dnorm(x)
plot(x,y,
     type = "l",
     xlab = "Normal Deviate",
     ylab = "Density",
     yaxs = "i")
pnorm(1.96)#位于z左侧的标准正态曲线下方面积是多少
qnorm(0.9,mean = 500,sd = 100)#均值为500,标准差100的正态分布的0.9分位点值是多少
rnorm(50,mean = 50, sd = 10)#随机生成50个均值为50,标准差为10的正态随机数

#设定随机数种子
runif(5)#生成0到1区间服从均匀分布的伪随机数
runif(5)
set.seed(123)
runif(5)
set.seed(123)
runif(5)

#生成多元正态数据
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("y","x1","x2")
dim(mydata)

#字符处理函数
cha1 <- c("ab","cbd","fihg")
nchar(cha1)#计算向量中各个元素的字符数量
nchar(cha1[3])
substr(cha1,1,2)#提取字符向量中的子串substr(x,start,stop)
substr(cha1,1,2)<-"22"#替换字符向量中的子串
cha2 <- c("Ab","Abd","afihg","bahs")
#在x中搜寻某种模式
#fixed = FALSE则pattern为正则表达式
#fixed = TRUE则pattern为文本字符串
grep("A",cha2,fixed = TRUE)
grep("A",cha2,ignore.case = TRUE)
#搜索并替换,其中\\s是正则表达式,表示空白
sub("\\s",".","hello lily")
#分割字符向量中的元素
strsplit("abcd","")
strsplit("a-b-c-d","-")
strsplit("a-bc-d","-")
#连接字符串
paste("my",c("love","spirit","soul"),sep = " ")
#小写转大写
toupper("Abcd")
#大写转小写
tolower("AbCd")

#其它实用函数
length(cha2)#对象的长度
seqdata <- seq(from=2,to=10,by=2)#从2到10生成一个差为2的序列seq(from,to,by)
rep(2,4)#2重复4次
#将连续性变量x分割成有n个水平的因子
set.seed(001)
cutdata <- runif(200)
cut(cutdata,20)
#创建美丽的分割点,通过选取n+1个等间距的取整值,将连续型变量x分割成n个区间
x<- pretty(c(-3,3),30)
#连接...中的对象,并将其输出到屏幕上或文件中
fistname <- c("Jane")
cat("Hello",fistname,"\n","I am Lily")
# \n表示新行 \t制表符 \'单引号 \b退格,?Quotes了解更多

#将函数应用于矩阵和数据框 apply
a <- 5
sqrt(a)
b <- c(1.32,1.55,20.58554,5.13)
round(b,digits = 1)
signif(b,digits = 3)
d <- matrix(runif(12),nrow = 3)
mean(d)
log(d)
#apply实现求各行或各列运算
#apply(array数据对象, margin维度下标1行2列,FUN自己定义的函数 其它参数...)
apply(d, 2, mean)
#practice 
options(digits = 2)#限定输出小数点后数字的位数为2
student <- c("Jonh Dive","Lily Zhang","Hong Zhang","Jaccy White","Zionh Bive",
             "Cily Chang","Wong Mang","Kaccy Phite","Bily Tang","Qing Yeng")
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)
#目标:
#综合三科成绩,计算学生成绩,按相对名次对学生成绩排名并给出A-E的评分,最后按姓氏首字母进行排序
#1.标准化,综合三科成绩,求均值
z <- scale(roster[,2:4])
score <- apply(z,1,mean)
roster1 <- cbind(roster,score)

#按相对名次对学生成绩排名并给出A-E的评分,如前20%,后20%
y <- quantile(score,c(0.8,0.6,0.4,0.2)) #此处为0.74  0.44 -0.36 -0.89 
roster1$grade[score >= y[1]]<-"A"
roster1$grade[score >= y[2] & score <= y[1]]<-"B"
roster1$grade[score >= y[3] & score <= y[2]]<-"C"
roster1$grade[score >= y[4] & score <= y[3]]<-"D"
roster1$grade[score <= y[4]]<-"E"

#按姓氏首字母进行排序
name <- strsplit(roster1$student," ")
Firstname <- sapply(name, "[",1)# "[" 是一个可以提取某个对象的一部分的函数
Lasttname <- sapply(name, "[",2)
roster2 <- cbind(Firstname,Lasttname,roster1[,2:6])
roster3 <- roster2[order(Lasttname,Firstname),]

#控制流
#语法重点
#语句(statement)是一条单独的R语句或者一组复合语句,包含在{}中的一组R语句,使用分号间隔
#条件(cond)是一条最终被解析为TRUE或FALSE的求值表达式
#表达式(expr)是一条数值或字符串序列
#序列(seq)是一个数值或字符串序列

#重复与循环
#循环结构包括for和while结构
#for 循环至某个变量值不包含在序列seq中为止 语法为:for(var in seq) statement
for (i in 1:5) {print("OK")
  
}
#while循环至条件不为真 语法为:while(cond) statement
i <- 10
while (i>2) {print("Hello");i <- i-3
  
}
#如果括号内while的条件没有改变,它会循环永不停止,如删除i <- i-3这个条件
#处理大数据时,最好联用R中的内建数值/字符处理函数和apply族函数


#条件执行 if-else ifelse switch
#if-else结构,语法:if (cond) statement或if (cond) statement else statement2
student <- c("A","A","B","A","B","A","B","A")
str(student)
if(is.character(student)) student <- as.factor(student)
str(student)
if(!is.factor(student)) student <- as.factor(student) else print("Student already is a factor")

#ifelse结构,语法ifelse (cond, statement1,statement2) 
#在程序行为是二元时,或希望输入和输出均为向量时,请用ifelse
science <- c(95,99,80,82,75,85,80,95,89,86)
outcome <- ifelse(science>=90, "Great","Good")

#switch结构,语法为:switch(expr, ...) ...表示与expr的各种可能输出值绑定的语句
char <- c("1","100")
for (i in char) {
  print(
    switch(i,
           "1"="great",
           "2"="just soso",
           "100"="too bad")
  )
  
}


#用户自编函数
#一个自编函数的结构大致如此
#myfunction <- function(arg1,arg2,...){
#statements
#return(object)
#}

#practice
#编写一个函数用来计算数据对象的集中趋势和散布情况
mystate <- 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("Mean=",center,"\n","SD=",spread,"\n")
  }
  else if(print&!parametric){
    cat("Median=",center,"\n","MAD=",spread,"\n")
  }
  result <- list(center=center,spread=spread)
  return(result)
}
set.seed(002)
x <- rnorm(500)
y <- mystate(x,parametric=FALSE,print=TRUE)#输出非参数统计量
y <- mystate(x)#输出参数统计量

#输出当天日期,并设定自己想要的输出格式
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("whatever")
# warning() message() stop()都可以用来提示当前表达式的错误

#数据整合与重构
help(mtcars)
#转置t()
cars <- mtcars[1:5,1:4]
t(cars)

#整合数据aggregate(x.by.FUN)
options(digits = 3)
attach(mtcars)
aggdata <- aggregate(mtcars,by=list(cyl,gear),FUN = mean,rm.na=TRUE)
aggdata 
#解读:Group.1 Group.2 分别表示cyl,gear;举例第一行来说汽缸数=4,
#且档位数=3的车每加仑汽油形式英里数mpg平均为21.5


#reshape2包 融合(melt)+重构(dcast)
student <- c("Jonh Dive","Lily Zhang","Hong Zhang","Jaccy White","Zionh Bive",
             "Cily Chang","Wong Mang","Kaccy Phite","Bily Tang","Qing Yeng")
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)
library(reshape2)
rosterlong <- melt(roster,id="student",variable.name = "subject",value.name = "score")
rosterwidth <- dcast(rosterlong,student~subject,value.var="score")

你可能感兴趣的:(R语言实战,r语言,开发语言)