#数值和字符处理函数
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位长度
x
#查找字符串,均支持正则表达式
#函数一,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")