数学函数
#round(x,digits=n)小数位数,signif(x,digits=n)有效数字位数,trunc()直接去除小数
#log(x,base=n)对x取以n为底的对数
#统计函数
#sd(x)标准差,range(x)求值域,diff(x,lag=n)求滞后差分,
#scale(x,center=TRUE,scale=TRUE)对数据对象x进行中心化或者标准化
#进行任意均值和方差的标准化
#对矩阵或者数据框
newdata <- scale(mydata)
newdata <- scale(mydata)*SD+M
#SD标准差,M均值
#对某一列进行标准化
newdata <- transform(mydata,myvar=scale(myvar)*10+50)
x <- c(1,2,3,4,5,6,7,8)
mean(x)
sd(x)
n <- length(x)
meanx <- sum(x)/n
css <- sum((x-meanx)^2)
sdx <- sqrt(css/(n-1))
meanx
sdx```
#概率函数
生成-3到3的31个值的序列
x <- pretty(c(-3,3),30)
密度函数d的正态分布norm
y <- dnorm(x)
yaxs表示y轴的画轴方法,i表示刻度线都在数据范围内部
plot(x,y,type="l",xlab="NormalDeviate",ylab = "Density",yaxs="i")
通过指定随机数种子,可以再现以前的结果
set.seed(1234)
runif()函数生成0到1之间的均匀分布的随机数
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)
mvrnorm produces one or more samples from the specified multivariate normal distribution
500是想要的样本大小,返回结果是一个矩阵
mydata <- mvrnorm(500,mean,sigma)
转化成数据框
mydata <- as.data.frame(mydata)
names(mydata) <- c("y","x1","x2")
dim(mydata)
head(mydata,n=10)```
字符处理函数
#paste()连接字符串,分隔符为seq
paste("x",1:3,"a",sep = "_")
#rep(x,n)将x重复n次,将1:3这个向量重复两次
y <- rep(1:3,2)
#将选取n+1个等间距的整数值,将一个连续型变量x分隔成n个区间,画图常用
pretty(c(-3,3),30)
#将函数应用于矩阵和数据框
a <- 5
sqrt(a)
b <- c(1.243,5.345,2.99)
round(b)
c <- matrix(runif(12),nrow=4)
c
log(c,base = 2)
mean(c)
#apply()函数,可以将任意函数应用到矩阵,数组,数据框的任何维度上
#apply(x,MARGIN,FUN),MARGIN=1表示行,MARGIN=2表示列
apply(c,1,mean)
#按列计算均值
apply(c,2,mean)
#计算截尾均值,基于中间20%的数据,最高和最低的40%将被忽略
apply(c,2,mean,trim=0.4)```
#处理学生成绩
包括成绩变量的标准化,给出评分,名字排序
options(digits = 2)
Student <- c("John Davis","Angela Williams","Bullwinkle Moose","Kevin Du","Janice MarkHammer",
"Cheryl Cushing","Reuven Ytzrhak","Greg Knox","Joel England","Mary Rayburn")
Math <- c(502,600,412,634,495,512,410,625,573,522)
Science <- c(95,99,80,98,75,85,80,95,89,86)
English <- c(25,22,18,26,28,15,30,27,18,15)
roster <- data.frame(Student,Math,Science,English,stringsAsFactors = FALSE)
scale进行数据的标准化,针对每一列
z <- scale(roster[,2:4])
对每一行求平均值
score <- apply(z,1,mean)
然后将score列和roster合并,横向合并,添加列
roster <- cbind(roster,score)
计算分位数,0.8等作为分位点
y <- quantile(score,c(0.8,0.6,0.4,0.2))
建立新变量,score >= y[1]将返回一个logical向量,变量的重编码
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"
开始处理学生姓名
strsplit函数分割字符向量x中的元素,返回一个列表,有10个成分,每个有两项
name <- strsplit((roster$Student)," ")
"["也是个函数,"["(x,2)表示提取x向量中的第二个元素
lastname <- sapply(name,"[",2)
firstname <- sapply(name,"[",1)
roster[,-1]表示去除第一列
roster <- cbind(firstname,lastname,roster[,-1])
order返回一个排序后的行索引值向量
roster <- roster[order(firstname,lastname),]
roster <- roster[order(-score),]```
程序控制结构
for(i in 1:10) print("hello world")
i<-10
while(i>0){print("hello");i<-i-1}
grade <- "love"
if(!is.factor(grade)) grade<-as.factor(grade) else print("grade is already a factor")
#ifelse结构
score<-4
ifelse(score>2,print("passed"),print("failed"))
outcome <- ifelse(score > 2,"passed","failed")
#switch结构
#根据i的值,选择后面执行哪条语句
fellings <- c("sad","afraid")
for(i in fellings)
print(
switch(i,
happy="i am glad you are happy",
afraid="there is nothing to fear",
sad="cheer up",
angry="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")
}
生成一个列表,name1=object1
result <- list(center=center,spread=spread)
return(result)
}
set.seed(1234)
Density,distribution function,quantile(分位数)function and random generation for the normal
distribution with mean equal to mean and standard deviation equal to sd.
x<-rnorm(500)
y <- mystats(x)
返回的y是一个列表
y$center;y$spread;y[1];y[2]
y <- mystats(x,parametric = TRUE,print = TRUE)
y```
一个switch函数
mydate <- function(type="long"){
switch(type,
#%A是非缩写星期名,%B非缩写月份
long = format(Sys.Date(),"%A %B %d %Y"),
short = format(Sys.Date(),"%Y-%m-%d"),
cat(type,"is not a recognized type\n")
)
}
mydate("long")
mydate("short")
mydate("middle")```
#转置矩阵
cars <- mtcars(1:5,1:4)
t(cars)```
整合数据
options(digits = 3)
attach(mtcars)
#将数据折叠(整合),by中的变量必须在list中,哪怕只有一个变量,函数可以使用自定义函数
aggdata <- aggregate(mtcars,by=list(Group.cyl=cyl,Group.gear=gear),FUN = mean,na.rm=TRUE)
aggdata
detach(mtcars)```