读书笔记_第五章

#数值和字符处理函数

abs(-4) #返回4,绝对值
sqrt(25) #返回5,平方根
sqrt(c(4,16,25)) #返回2,4,5,向量求平方根

ceiling(3.475) #返回4,不小于3.475的最小整数
floor(3.475) #返回3,不大于3.475的最大整数
trunc(3.475) #返回3,取整数部分
round(3.475,digits = 2) #返回3.48,保留2位小数
round(3.475) #返回3,仅取整数部分

signif(3.475,digits = 2) #返回3.5,总位数保留两位

log(10)  #返回2.3026,以e为底对10求对数
exp(2.306)  #返回10,e的10次幂

log10(10) #返回1,以10为底对10求对数
log(10,base = 10) #返回1,以10为底对10求对数

cos(2) #返回-0.416,余弦
acos(-0.416) #返回2,反余弦

sin(0) #返回0,正弦
asin(0) #返回0,反正弦

tan() #返回,正切
atan() #返回,反正切

cosh() #返回,双曲余弦
acosh() #返回,反双曲余弦

sinh(2) #返回3.627,双曲正弦
asinh(3.627) #返回2,反双曲正弦

tanh() #返回,双曲正切
atanh() #返回,反双曲正切

#统计函数
min(c(1,2,3,4)) #返回1,最小值
max(c(1,2,3,4)) #返回4,最大值
sum(c(1,2,3,4)) #返回10,和
range(c(1,2,3,4)) #返回1,4,值域

mean(c(1,2,3))  #返回2,平均数
mean(c(1,2,3,4,5,6,7,8,9,10)) #返回5.5,平均数
mean(c(1,2,3,4,5,6,7,8,9,10),trim=0.05,na.rm = TRUE) #返回5.5,丢弃了最大5%和最小5%的数据和所有缺失值后的算术平均数

median(c(1,2,3,4)) #返回2.5,中位数
sd(c(1,2,3,4)) #返回1.29,标准差
var(c(1,2,3,4)) #返回1.67,方差
quantile(c(1,2,3,4),c(0.3,0.84)) #返回1.90,3.52,基于向量找30%分位数,84%分位数

diff(c(1,5,23,29),lag=1) #返回4,18,6,基于lag,构造新数列(5-1,23-5,29-26)
diff(c(1,5,23,29),lag=2) #返回22,24,基于lag,构造新数列(23-1,29-5)

scale(x,center=TRUE,scale=TRUE) #中心化,仅对数值列有效
scale(x) #对数据框或者矩阵的指定列进行均值为0,标准差为1的标准化
scale(x)*SD + M #SD是标准差,M是均值

mad(c(1,2,3,4)) #返回1.48,绝对中位差
#分解步骤
m <- median(c(1,2,3,4)) #返回2.5,原始样本的中位数
n <- abs(c(1,2,3,4)-m) #原始样本-原始中位数,取绝对值,形成新数据向量
md <- median(n) #返回1,新样本的中位数
#虽然md为1,但在R中样本服从正态分布时,标准差的估计=1.4826*绝对中位差 1.4826*1=1.4826


#概率函数,允许生成模拟数据,即从已知特征的概率分布中抽样得到
# d = 密度函数(density)
# p = 分布函数(distribution function)
# q = 分位数函数(quantitle function)
# r = 生成随机数(随机偏差)
#二项分布        binom
#卡方分布        chisq
#指数分布        exp
#F分布           f
#Logistic分布   logis
#正态分布        nrom
#                     pnorm(1.96),表示位于z=1.96左侧,标准曲线下方面积
#                     qnorm(0.9,mean=500,sd=100),均值为500,标准差为100的0.9分位点值:628.16
#                     rnorm(50,mean=50,sd=10),生成50个均值为50,标准差为10的正态随机数
#泊松分布        pois
#t分布            t
#均匀分布        unif

#范例一,在【-3,3】的区间画正态分布图
x <- pretty(c(-3,3),30)
y <- dnorm(x)
plot(x,y,
     type = "l",
     xlab = "Normal Deviate",
     ylab = "Density",
     yaxs = "i"
     )

#范例二,基于总体数据特征(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
) #方差-协方差矩阵
mydata <- mvrnorm(500,mean,sigma)
class(mydata)  #返回matrix
mydata <- as.data.frame(mydata) #强制转换成数据框
names(mydata) <- c("y","x1","x2") #命名
dim(mydata) #查看维度信息
head(mydata)  #查看数据集前六行
head(mydata,n=10) #查看数据集前十行


#字符处理函数
nchar(c("ab","cde","fghij"))  #返回2,3,5,单元素中字符数量
length(c("ab","cde","fghij"))  #返回3,元素总个数

x <- "abcdef"
substr(x,2,4) #返回bcd,第二位到第四位,提取子串
substr(x,2,4) <- "223344" #x已经被新串修改,第二位到第四位=3位长度,目标串中取3位长度

#查找字符串,均支持正则表达式

#函数一,grep
#若fixed=TRUE,则被查找对象是一个文本字符串
#若fixed=FALSE,则被查找对象是一个文本表达式
grep("A",c("b","A","c"),fixed = TRUE) #返回2,查找字符串,返回下标

#函数二,sub,查找并替换
#若fixed=TRUE,则被查找对象是一个文本字符串
#若fixed=FALSE,则被查找对象是一个文本表达式
sub("\\s",".","Hello There",fixed = FALSE) #返回Hello.There,查找\s(空白),\是转义字符,必须写成\\s

#函数三,strsplit
y<-strsplit("a b c"," ") #返回list对象,一个元素,3个字符"a","b","c"
length(y) #长度为1
class(y) #list
x <- unlist(y) #将list对象转换成字符型向量
is.vector(x) #返回TRUE
class(x) #字符类型

unlist(y)[2] #返回b,取向量中第二个位置的值

l <- list(c("a","b","c"))
length(l) #长度为1
class(l) #list

#按照规则,批量生成字符串
v <- paste("x",1:3,sep="") #返回c("x1","x2","x3","x4")
is.vector(v) #返回TRUE
class(v) #返回字符串

paste("x",1:3,sep="M") #返回c("xM1","xM2","xM3","xM4")

paste("Today is",date()) #返回"Today is Mon Dec 17 21:13:06 2018"

#将小写转换成大写
toupper("abc") #返回ABC

tolower("AcD") #返回acd

#其他实用函数

v <- seq(1,10,2) #返回向量c(1,3,5,7,9),1~10的范围类,步长为2

y <- rep(1:3,2) #返回向量c(1,2,3,1,2,3),原始变量为一个整体,整体复制2次

x <- cut(1:9,3,ordered_result = TRUE) #返回,将连续变量1~9,分割成三个有顺序的因子
is.factor(x) #FALSE
class(x) #字符型

pretty(c(-3,3),8)  #返回c(-3,-2,-1,0,1,2,3),根据给定区间,生成对称的坐标刻度点,绘图中常用
pretty(c(-3,3),2)  #返回c(-5,0,-5),根据给定区间,生成对称的坐标刻度点

cat("China","\n","Shanghai")  #拼接字符串,默认用空格隔开
cat("Hello","Bob",".\n","Isn\'t R","\t","GREAT?\n")
cat("Hello","Bob","\b.\n","Isn\'t R","\t","GREAT?\n") #\b用来删除Bob与.之间的连接空格
#\b 表示退格(删除空格),\n 表示新行,\t为制表符

#将函数应用于数据对象
a <- 5
sqrt(a) #对单个值操作

b <- c(1.243,5.654,2.99)
round(b,2) #对多个值操作,返回1.24 5.65 2.99

#runif,unif 均匀分布,用来生成0~1区间的服从均匀分布的伪随机数
c <- matrix(runif(12),nrow=3)
c
log(c)  #对矩阵中每一个值取对数

# apply函数,可以将任意一个函数应用到矩阵,数组,数据框的任何维度上
mydata <- matrix(rnorm(30),nrow=6)
mydata
apply(mydata,1,mean) #针对矩阵,维度1(行维度),求均值,不是列向量纵向展示
apply(mydata,2,mean) #针对矩阵,维度2(列维度),求均值,不是列向量纵向展示
apply(mydata,2,mean,trim=0.2) #针对矩阵,维度2(列维度),忽略20%最大值,20%最小值,剩下60%数据求均值,

#整体解决方案
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) #根据向量生成数据框

# 计算综合得分
# center=TRUE 中心化,数据集中各项数据减去数据集的均值
# center=TRUE,scale=TRUE 标准化,中心化后的数据\数据集的标准差 (默认值)
# 中心化,标准化意义一样,为了消除量纲对数据结构的影响
z <- scale(roster[,2:4]) #将Math,Science,English三科,进行标准化,得到10*3的矩阵
class(z) #反馈矩阵

score <- apply(z,1,mean) #行维度,计算均值,得到每一个人的三科综合平均分

roster <- cbind(roster,score) #综合平均分,新列追加进数据源

# 按照百分位数进行进行A~F资格评定,百分位刻度线上标识等级
y <- quantile(score,c(0.8,0.6,0.4,0.2)) #找80%,60%,40%,20%百分位点

#利用新列存储等级标识
attach(roster)
roster$grade[score >= y[1]] <- "A"
roster$grade[score >= y[2] & score < y[1]] <- "B"
roster$grade[score >= y[3] & score < y[2]] <- "C"
roster$grade[score >= y[4] & score < y[3]] <- "D"
roster$grade[score < y[4]] <- "E" #列名里面的条件不加逗号
detach(roster)

#提取姓,名独立列
name <- strsplit(roster$Student," ") #返回list对象,每行返回姓,名
class(name) #返回列表对象
#"[",是一个可以提取某个对象的一部分的函数
Lastname <- sapply(name,"[",2) #提取name 每一个元素的第二列
Firstname <- sapply(name,"[",1) #提取name 每一个元素的第一列
roster <- cbind(Firstname,Lastname,roster[,-1]) #绑定列,Firstname,Lastname,删除student列的roster

roster <- roster[order(Firstname,Lastname),]  #依据Firstname,Lastname排序,修改原始数据框

#控制流

#for 结构,变量值自变化,超过范围值就退出循环,没有大括号
for( i in 1:10) 
    print(paste("Hello",i))

#while 结构,变量值需要代码处理,超过范围值就退出循环
i <- 10
while (i > 0)
{
    print(paste("Hello",i));
    i <- i-1
}

#if-else结构
if(4>3) print("大于")  #缺省else结构
if(is.na("NA")) print("T") else print("F") #if,else结构

x <- 1:10
y <- ifelse(x>5,1,0) #当x>5时,赋值1,否则赋值0,简写版本
y

#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",
               andry = "Calm down now"
            
        )
    )

# 自定义函数
mystats <- function(x,parametric = TRUE,print=FALSE) #函数定义后,需要赋值一个对象
{
    if(parametric)
    {
        center <- mean(x);
        spread <- sd(x)
    }else{
        center <- median(x);
        spread <- mad(x)
    }
    
    if(print & parametric)
    {
        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(1234)
x <- rnorm(500)
y <- mystats(x,parametric = FALSE,print=TRUE)

#整合和重构
#转置
cars <- mtcars[1:5,1:4]
cars_t <- t(cars) #转置后赋值给新矩阵,原矩阵不被修改

#整合
options(digits = 3)
attach(mtcars)
#Group.1 对应cyl列的值
#Group.2 对应gear列的值
#基于分组列,分组后,其余各列按照统计函数进行统计计算
aggdata <- aggregate(mtcars,by=list(cyl,gear),FUN = mean,na.rm=TRUE)
detach(mtcars)


#介绍reshape2包,r 3.4.4中不支持此功能
install.packages("reshap2")
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值