20171205(从有道迁移)
高级数据管理
-
示例问题:
- 给所有学生确定一个单一的成绩衡量指标,需要将这些科目的成绩组合起来;
- 将前20%的学生评定为A,接下来20%的学生评定为B,依次类推;
- 按字母顺序对学生排序
- 示例数据,学生成绩数据
学生姓名 数 学 科 学 英 语 John Davis 502 95 25 Angela Williams 600 99 22 Bullwinkle Moose 412 80 18 David Jones 358 82 15 Janice Markhammer 495 75 20 Cheryl Cushing 512 85 28 Reuven Ytzrhak 410 80 15 Greg Knox 625 95 30 Joel England 573 89 27 Mary Rayburn 522 86 18 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,88,86) English <- c(25,22,18,15,20,28,15,30,27,18) roster <- data.frame(Student,Math,Science,English,stringsAsFactors=FALSE)
-
数值和字符处理函数
- 数学函数
函 数 描 述 abs(x) 绝对值 abs(-4) 返回值为4 sqrt(x) 平方根 sqrt(25)返回值为5和25^(0.5)等价 ceiling(x) 不小于x的最小整数 </br>ceiling(3.475) 返回值为4 floor(x) 不大于x的最大整数 </br>floor(3.475) 返回值为3 trunc(x) 向 0 的方向截取的x中的整数部分 </br>trunc(5.99) 返回值为5 round(x, digits=n) 将x舍入为指定位的小数 </br>round(3.475, digits=2) 返回值为3.48 signif(x, digits=n) 将x舍入为指定的有效数字位数 </br>signif(3.475, digits=2) 返回值为3.5 cos(x)、sin(x) 、tan(x) 余弦、正弦和正切</br>cos(2) 返回值为–0.416 acos(x) 、asin(x) 、atan(x) 反余弦、反正弦和反正切 </br>acos(-0.416)返回值为2 cosh(x) 、sinh(x) 、tanh(x) 双曲余弦、双曲正弦和双曲正切 </br> sinh(2)返回值为3.627 acosh(x) 、asinh(x) 、atanh(x) 反双曲余弦、反双曲正弦和反双曲正切 </br>asinh(3.627)返回值为2 log(x,base=n) 对x取以n为底的对数 log(x) log10(x) 为了方便起见 </br>log(x)为自然对数 </br>log10(x)为常用对数 </br>log(10)返回值为2.3026 </br>log10(10)返回值为1 exp(x) 指数函数 exp(2.3026)返回值为10 -
统计函数
- 常用的统计函数其中许多函数都拥有可以影响输出结果的可选参数,请使用help()了解以上每个函数和其参数的用法。
- 函数
函 数 描 述 mean(x) 平均数 mean(c(1,2,3,4))返回值为2.5 </br>median(x) 中位数 median(c(1,2,3,4))返回值为2.5 sd(x) 标准差 sd(c(1,2,3,4))返回值为1.29 var(x) 方差 var(c(1,2,3,4))返回值为1.67 mad(x) 绝对中位差(median absolute deviation) </br>mad(c(1,2,3,4))返回值为1.48 quantile(x,probs) 求分位数。</br>其中x为待求分位数的数值型向量,</br>probs为一个由[0,1]之间的概率值组成的数值向量 </br># 求x的30%和84%分位点 </br>y <- quantile(x, c(.3,.84)) range(x) 求值域 </br>x <- c(1,2,3,4) </br>range(x)返回值为c(1,4) </br>diff(range(x))返回值为3 sum(x) 求和 </br>sum(c(1,2,3,4))返回值为10 diff(x, lag=n) 滞后差分,</br>lag用以指定滞后几项。默认的lag值为1 </br>x<- c(1, 5, 23, 29) </br>diff(x)返回值为c(4, 18, 6) min(x) 求最小值 </br>min(c(1,2,3,4))返回值为1 max(x) 求最大值 </br>max(c(1,2,3,4))返回值为4 scale(x,center=TRUE,scale=TRUE) 为数据对象x按列进行中心化(center=TRUE)或标准化(center=TRUE,scale=TRUE); --均值和标准差的计算 x <- c(1:8) mean(x) sd(x)
-
数据的标准化
函数scale()对矩阵或数据框的指定列进行均值为0、标准差为1的标准化
newdata <- scale(mydata)
要对每一列进行任意均值和标准差的标准化,可以使用如下的代码
newdata <- scale(mydata)*SD+M
其中的M是想要的均值,SD为想要的标准差。
要对指定列而不是整个矩阵或数据框进行标准化,你可以使用这样的代码:
newdata <- transform(mydata,myvar=scale(myvar)*10+50)
此句将变量myvar标准化为均值50、标准差为10的变量
-
概率函数
- 概率函数通常用来生成特征已知的模拟数据,以及在用户编写的统计函数中计算概率值;
- 在R中,概率函数形如:
[dpqr]distribution_abbreviation()
其中:
- d = 密度函数(density)
- p = 分布函数(distribution function)
- q = 分位数函数(quantile function)
- r = 生成随机数(随机偏差)
- 函数:
分布名称 缩 写 Beta分布 beta Logistic分布 logis 二项分布 binom 多项分布 multinom 柯西分布 cauchy 负二项分布 nbinom (非中心)卡方分布 chisq 正态分布 norm 指数分布 exp 泊松分布 pois F分布 f Wilcoxon符号秩分布 signrank Wilcoxon秩和分布 wilcox Gamma分布 gamma t分布 t 几何分布 geom 均匀分布 unif 超几何分布 hyper Weibull分布 weibull 对数正态分布 lnorm -
设定随机数种子
在每次生成伪随机数的时候,函数都会使用一个不同的种子,因此也会产生不同的结果。你可以通过函数set.seed()显式指定这个种子,让结果可以重现(reproducible)。
runif(5) set.seed(12345) runif(5) set.seed(12345) runif(5)
-
生成多元正态数据
==在模拟研究和蒙特卡洛方法中,经常需要获取来自给定均值向量和协方差阵的多元正态分布的数据。MASS包中的mvrnorm()函数可以让这个问题变得很容易?==
字符处理函数
函 数 描 述 nchar(x) 计算x中的字符数量 </br>x <- c("ab", "cde","fghij") </br>length(x)返回值为 3 </br>nchar(x[3])返回值为5 substr(x, start, stop) 提取或替换一个字符向量中的子串 </br>x <- "abcdef" </br>substr(x, 2, 4)返回值为"bcd" </br>substr(x, 2, 4) <- "22222"(x将变成"a222ef") grep(pattern, x, </br>ignore.case=FALSE,fixed=FALSE) 在x中搜索某种模式。</br>若fixed=FALSE,则pattern为一个正则表达式。</br>若fixed=TRUE,则pattern为一个文本字符串。</br>返回值为匹配的下标 </br>grep("A",c("b","A","c"),fixed=TRUE)返回值为2 sub(pattern, replacement, </br>x,ignore.case=FALSE, fixed=FALSE) 在x中搜索pattern,并以文本replacement将其替换。 </br>若fixed=FALSE,则pattern为一个正则表达式。 </br>若fixed=TRUE,则pattern为一个文本字符串 </br>sub("\s",".","Hello There")返回值为Hello.There。</br>注意,"\s"是一个用来查找空白的正则表达式;</br>使用"\s"而不用""的原因是,后者是R中的转义字符 strsplit(x, split, fixed=FALSE) 在split处分割字符向量x中的元素。</br>若fixed=FALSE,则pattern为一个正则表达式。</br>若fixed=TRUE,则pattern为一个文本字符串 </br>y <- strsplit("abc", "")将返回一个含有1个成分、3个元素的列表,包含的内容为"a" "b" "c" </br>unlist(y)[2]和sapply(y, "[", 2)均会返回"b" paste(…, sep="") 连接字符串,分隔符为sep </br>paste("x", 1:3,sep="")返回值为c("x1", "x2", "x3") </br>paste("x",1:3,sep="M")返回值为c("xM1","xM2" "xM3") </br>paste("Today is", date())返回值为Today is Thu Jun 25 14:17:32 2011 toupper(x) 大写转换 toupper("abc")返回值为"ABC" tolower(x) 小写转换 tolower("ABC")返回值为"abc" - 其他使用函数
函 数 描 述 length(x) 对象x的长度 </br>x <- c(2, 5, 6, 9)</br>length(x)返回值为4 seq(from, to, by) 生成一个序列 </br>indices <- seq(1,10,2) </br>indices的值为c(1, 3, 5, 7, 9) rep(x, n) 将x重复n次 </br>y <- rep(1:3, 2)</br>y的值为c(1, 2, 3, 1, 2, 3) cut(x, n) 将连续型变量x分割为有着n个水平的因子</br>使用选项ordered_result = TRUE以创建一个有序型因子 pretty(x, n) 创建美观的分割点。</br>通过选取n+1个等间距的取整值,将一个连续型变量x分割为n个区间。</br>绘图中常用 cat(... , file ="myfile", append =FALSE) 连接...中的对象,并将其输出到屏幕上或文件中(如果声明了一个的话)</br>firstname <- c("Jane")</br>cat("Hello" ,firstname, "\n") - 将函数应用于矩阵和数据框
- R函数可以应用到一系列的数据对象上,包括标量、向量、矩阵、数组和数据框;
- apply()函数,可将一个任意函数“应用”到矩阵、数组、数据框的任何维度上。apply函数的使用格式为:apply(x,MARGIN,FUN,...)
- x为数据对象
- MARGIN是维度的下标,在矩阵或数据框中,MARGIN=1表示行,MARGIN=2表示列。
- FUN是指定的函数
- ...则包括了任何想传递给FUN的参数。
mydata <- matrix(rnorm(30),nrow=6) apply(mydata,1,mean) apply(mydata,2,mean) apply(mydata,2,mean,trim=0.2)
-
示例问题的其中一种解决方案
--options(digits=2)限定了输出小数点后数字的位数 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,88,86) English <- c(25,22,18,15,20,28,15,30,27,18) roster <- data.frame(Student,Math,Science,English,stringsAsFactors=FALSE) --对第2列到第4列的成绩进行数据标准化 z <- scale(roster[,2:4]) --计算数据标准化后每个学生的成绩 score <- apply(z,1,mean) --合并到roster数据集中 roster <- cbind(roster,score) --求得80%,60%,40%,20%分数段的分数值 y <- quantile(score,c(.8,.6,.4,.2)) --计算评分 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" --按照空格分隔姓氏,并获取lastname和firstname name <- strsplit((roster$Student)," ") lastname <- sapply(name,"[",2) firstname <- sapply(name,"[",1) roster <- cbind(firstname,lastname,roster[,-1]) --按照姓氏排序 roster <- roster[order(lastname,firstname),]
-
控制流
- 基础概念
- 语句(statement)是一条单独的R语句或一组复合语句(包含在花括号{ } 中的一组R语句,使用分号分隔);
- 条件(cond)是一条最终被解析为真(TRUE)或假(FALSE)的表达式;
- 表达式(expr)是一条数值或字符串的求值语句;
- 序列(seq)是一个数值或字符串序列
- 重复和循环
-
for循环,for循环重复地执行一个语句,直到某个变量的值不再包含在序列seq中为止。语法为:
for(var in seq) statement
-
while结构,while循环重复地执行一个语句,直到条件不为真为止。语法为:
while(cond) statement
-
- 条件执行
-
if-else结构,控制结构if-else在某个给定条件为真时执行语句。也可以同时在条件为假时执行另外的语句。语法为:
if(cond) statement
if(cond) statement else statement -
ifelse结构,ifelse结构是if-else结构比较紧凑的向量化版本,其语法为:
ifelse(cond,statement1,statement2)
若cond为TRUE,则执行第一个语句;若cond为FALSE,则执行第二个语句。
-
switch结构,switch根据一个表达式的值选择语句执行。语法为:
switch(expr,....)
其中的...表示与expr的各种可能输出值绑定的语句
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", angry = "Calm down now" ) )
-
- 基础概念
-
用户自编函数
-
自编函数结构
myfunction <- function(arg1,arg,...){ statements return(object) }
函数中的对象只在函数内部使用。返回对象的数据类型是任意的,从标量到列表皆可;
用函数warning()来生成一条错误提示信息
用message()来生成一条诊断信息
用stop()停止当前表达式的执行并提示错误。
==需要关注如何引入外部r包,和如何断点调试==
-
-
整合与重构
- 转置,转置(反转行和列)也许是重塑数据集的众多方法中最简单的一个了。使用函数t()即可对一个矩阵或数据框进行转置
- 整合数据,使用一个或多个by变量和一个预先定义好的函数来折叠(collapse)数据是比较容易的。
- 调用格式为:aggregate(x,by,FUN)
- x是待折叠的数据对象
- by是一个变量名组成的列表
- FUN则是用来计算描述性统计量的标量函数,它将被用来计算新观测中的值。
- ==reshape包,第三方包,要对包的使用再进一步了解==