高级数据管理
主要是数字的处理,字符的处理
1、一个数据处理难题
2、数值和字符处理函数
1、数学函数
#(1)数学函数
abs(-4)#取绝对值
floor(3.455)#取整函数
log(10)#取对数
log10(10)
round(3.475,digits = 2)#保留两位小数
round(3.425,digits=2)#等于靠近的偶数
2、统计函数
mean(c(1,2,3,4,5))#求均值
var(c(1,2,3,4,5))#求方差
sd(c(1,2,3,4,5))#求标准差
y<-quantile(c(1,2,3,4,5,6,7,8,9,10),c(0.2,0.99))#求分位数
y
3、概率函数
#(3)概率函数
beta#贝塔分布
norm#正态分布
cauchy#柯西分布
#d=密度函数
#p=分布函数
#q=分位数函数
#r=生成随机数
x<-pretty(c(-3,3),30)
x#生成31个数
y<-dnorm(x)#标准正态分布
plot(x,y)#画出图形
pnorm(1.96)#当x为1.96时分布函数值,概率
qnorm(0.9,mean = 500,sd=100)#分位数
rnorm(50,mean=30,sd=10)
实例:生成服从多元正态分布的数据
#实例
install.packages("MASS")
library(MASS)
options(digits = 3)#设置全局小数点位数为3
set.seed(1234)#设置全局的随机数为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(50000,mean,sigma)#生成服从分布的数据
mydata<-as.data.frame(mydata)#将数据转换成数据框
names(mydata)<-c("y","x1","x2")#重新命名
4、字符处理函数
x="aaabbbccc"
nchar(x)#字符串长度
substr(x,3,6)#截取x的3-6字符
5、其他实用函数
#(5)其他实用函数
xx<-c(2,5,6,8)
length(xx)#求向量的长度
yy<-seq(1,10,2)#从1到10每个两位生成一个数
zz<-rep(1:3,3)#1到3重复三次
zz
6、将函数应用于矩阵和数据框
#(6)将函数用于矩阵和数据框
b<-c(1.243,5.654,2.99)
b
b2<-round(b)#四舍五入
b2
c<-matrix(runif(12),nrow=3)
c
mean(c)
apply(c, 1,mean)#按行求均值
apply(c, 2,mean)#按列求均值
3、数据处理难题的一套解决方法
# 建立学生成绩表
Student <- c("John Davis","Angela Williams","Bullwinkle Moose",
"David Jones","Janice Markhammer",
"Cheryl Cushing","Reuven Ytzrhak",
"Grclass(roster$Student)#是字符串eg 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,否则里面的元素会变成因子
#步骤1:限定小数位数
options(digits = 2)
roster
#步骤2:将成绩进行标准化
z<-scale(roster[,2:4])#将2到4列转成标准分数
z
#步骤3:求平均分
score<-apply(z,1,mean)#计算每一行的均值
score
roster<-cbind(roster,score)#拼接
#步骤4:求分位数(定级别)
y=quantile(roster$score,c(0.8,0.6,0.4,0.2))#四个分位点
#步骤5:按分位数给成绩评定等级
roster$grade[roster$score>=y[1]]<-"A"
roster$grade[roster$score<y[1]&roster$score>=y[2]]<-"B"
roster$grade[roster$score<y[2]&roster$score>=y[3]]<-"C"
roster$grade[roster$score<y[3]&roster$score>=y[4]]<-"D"
roster$grade[roster$score<y[4]]<-"E"
#步骤6:拆分first name和last name
name<-strsplit((roster$Student)," ")
#步骤7:把拆开后的名字放回数据集中
fisrtname<-sapply(name,"[",1)
lastname<-sapply(name,"[",2)
roster<-cbind(fisrtname,lastname,roster[-1])#减去第一列
#步骤8:按照lastname排序
roster<-roster[order(lastname,fisrtname),]
4、控制流
#5.4控制流
#5.4.1重复和循环
for (i in 1:10) print("hello")
i=10
while (i>0) {
print("hello");
i<-i-1;
}
#5.4.2条件执行
(1)if(i==1){
print("nihao")
}else{
print("bye")
}
(2)#简便写法
ifelse(i==1,print("yes"),print("no"))#条件,结果一,结果二
(3)switch多条件多结果
#switch的用法是将输出结果进行转换
feelings<-c("sad","afraid")
for(i in feelings)
print(
switch(i,
happy="h",
afraid="af",
sad="s",
angry="an"
)
)
5、自编函数
#5.5用户自编函数
#5.5.1if-else结构自编函数
mystas<-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(1234)#让随机数可控
x<-rnorm(500)
x
y<-mystas(x)
y1<-mystas(x,parametric=FALSE,print=TRUE)