欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

R语言实战学习笔记-第五章 高级数据管理

程序员文章站 2022-07-14 20:46:09
...

本章内容

数学和统计函数
字符处理函数
循环和条件执行
自编函数
数据整合与重塑

5.1  一个数据处理难题
5.2  数值和字符处理函数

5.2.1数学函数
R语言实战学习笔记-第五章 高级数据管理
R语言实战学习笔记-第五章 高级数据管理
5.2.2 统计函数

R语言实战学习笔记-第五章 高级数据管理

5.2.3 概率函数

R语言实战学习笔记-第五章 高级数据管理

5.2.4 字符处理函数

R语言实战学习笔记-第五章 高级数据管理

5.2.5其他实用函数

R语言实战学习笔记-第五章 高级数据管理


5.2.6 将函数应用于矩阵和数据框

函数apply(),调用格式:apply(x,MARGIN,FUN,…),MARGEN=1表示行,2为列

5.3 数据处理难题的一套解决方案

5.1节中提出的问题是:将学生的各科考试成绩组合为单一的成绩衡量指标,基于相对名次

(前20%、下20%、等等)给出从A到F的评分,根据学生姓氏和名字的首字母对花名册进行排序

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)
z <- scale(roster[,2:4])#数据标准化
score <- apply(z,1,mean)#每一行计算均值
roster <- cbind(roster,score)#根据列合并
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"
name <- strsplit((roster$Student)," ")
Lastname <- sapply(name,"[",2)
#sapply()提取列表元素
#"["是一个可以提取某个对象的一部分的函数——在这里它是用来提取列表name各成分中的第一个或第二个元素的
Firstname <- sapply(name, "[",1)
roster <- cbind(Firstname,Lastname,roster[,-1])#[,-1]指删除第一列
roster[order(Lastname,Firstname),]

原始数据
roster
             Student Math Science English
1         John Davis  502      95      25
2    Angela Williams  600      99      22
3   Bullwinkle Moose  412      80      18
4        David Jones  358      82      15
5  Janice Markhammer  495      75      20
6     Cheryl Cushing  512      85      28
7     Reuven Ytzrhak  410      80      15
8          Greg Knox  625      95      30
9       Joel England  573      89      27
10      Mary Rayburn  522      86      18
结果:
roster[order(Lastname,Firstname),]
    Firstname   Lastname Math Science English score grade
6      Cheryl    Cushing  512      85      28  0.35     C
1        John      Davis  502      95      25  0.56     B
9        Joel    England  573      89      27  0.70     B
4       David      Jones  358      82      15 -1.16     F
8        Greg       Knox  625      95      30  1.34     A
5      Janice Markhammer  495      75      20 -0.63     D
3  Bullwinkle      Moose  412      80      18 -0.86     D
10       Mary    Rayburn  522      86      18 -0.18     C
2      Angela   Williams  600      99      22  0.92     A
7      Reuven    Ytzrhak  410      80      15 -1.05     F

5.4控制流  

5.4.1重复和循环 

 for结构  for(var in seq)  statement        

例:for(i in 1:10)  print(“Hello”)

 while结构  while(cond)  statement      

例:i<-10  while(i>0)  {print(“Hello”;i<-i-1)} 

5.4.2条件执行 

 if-else结构  

if(cond)  statement  

if(cond)  statement1  else  statement2 

 ifelse结构 

 ifelse(cond,statement1,statement2),若cond为TRUE,则执行第一个语句,否则执行第二个  

switch结构  swich(expr,…),…表示与expr的各种可能输出值绑定的语句

5.5 用户自编函数

假设你想编写一个函数,用来计算数据对象的集中趋势和散布情况。此函数应当可以选择性地给出参数统计量(均值和标准差)和非参数统计量(中位数和绝对中位差)。结果应当以一个含名称列表的形式给出。另外,用户应当可以选择是否自动输出结果。除非另外指定,否则此函数的默认行为应当是计算参数统计量并且不输出结果。

mystats <- function(x,parametric= TRUE,print = FALSE){
  if(parametric){
    center<-mean(x);speard <- sd(x)
  }else {
    center<- median(x);spread <- mad(x)
  }
  if(print & parametric){
    cat('Mean=',center,'\n','SD=',speard,'\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)
mydate<-function(type="long"){
  switch(type,
         long=format(Sys.time(),"%A %B %d %Y"),
         short=format(Sys.time(),"%m-%d-%y"),
         cat(type, "is not a recognized type\n")
  )
}
mydate("long")
mydate("short")

> mydate("long")
[1] "星期五 三月 30 2018"
> mydate("short")
[1] "03-30-18"

5.6 整合与重构

转置:t()函数,格式t(matrix)  

整合数据:aggregate(x,by,FUN),其中x是待折叠的数据对象,by是一个变量名组成的列表,这些变量将被去除掉以形成新的观测,而FUN则是用来计算描述性统计量的标量函数,它用来计算新观测中的值。

reshape包

library(reshape2)

md <- melt(mydata, id=c("ID", "Time"))

newdata <- dcast(md, formula, fun.aggregate)
其中的md为已融合的数据,formula描述了想要的最后结果,而fun.aggregate是(可选
的)数据整合函数。其接受的公式形如:
rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 + ...
在这一公式中,rowvar1 + rowvar2 + ...定义了要划掉的变量集合,以确定各行的内容,
而colvar1 + colvar2 + ...则定义了要划掉的、确定各列内容的变量集合

R语言实战学习笔记-第五章 高级数据管理