• R语言-基本数据管理


    目的:学会对原始的数据集进行整理(日期,缺失值,变量创建等),然后通过修改后的数据集可以更有针对性的来分析数据

    案例:分析男性和女性经理人在领导自己企业的不同

      问题:1.处于管理岗的男性和女性在服从上级的程度上是否有所不同

         2.导致不同的原因是因为性别还是国家,或者是年龄

     1.准备数据集

     1 manager <- c(1,2,3,4,5)
     2 date <- c('10/24/08','10/28/08','10/1/28','10/12/08','5/1/09')
     3 country <- c('US','US','UK','UK','UK')
     4 gender <- c('M','F','F','M','F')
     5 age <- c(32,45,25,39,99)
     6 q1 <- c(5,3,3,3,2)
     7 q2 <- c(4,5,5,3,2)
     8 q3 <- c(5,2,5,4,1)
     9 q4 <- c(5,5,5,NA,2)
    10 q5 <- c(5,5,2,NA,1)
    11 leadship <- data.frame(manager,date,country,gender,age,q1,q2,q3,q4,q5.stringAsFactors=F)

      2.修正异常数据

    1 leadship <- within(leadship,{
    2                           agecat <- NA
    3                           agecat[age>75 & age < 99] <- 'Elder'
    4                           agecat[age>= 55 & age <= 75] <- 'Middle Age'
    5                           agecat[age < 55] <- 'Young'})

    # 1.创建新的变量
    # 2.将该变量绑定到数据集上
    # 3.将新变量做条件筛选,如果age大于75岁表示值错误,用NA值进行填

    3.修改列明

    1 # 1.使用代码修改
    2 names(leadship[6:10]) <- c('item1','item2','item3','itgem4','item5')
    3 
    4 # 2.使用对话框修改
    5 fix(leadship)

    4.去掉NA值的数据行

    1 newdata <- na.omit(leadship)

    5.日期格式转换

    1 # 1.设置日期格式
    2 # 2.将该字段转换为日期类型
    3 myformat <- '%m-%d-%y'
    4 leadship$date <- as.Date(leadship$date,myformat)

    6.排序

    1 # 1.使用order(字段名)进行排序,默认是升序,加-就是降序
    2 attach(leadship)
    3 newdata <- leadship[order(gender,-age)]
    4 detach(leadship)

    7.剔除变量

    1 # 1.进行条件筛选,筛选出需要剔除的字段
    2 # 2.将操作后的数据集重新赋值
    3 myvars <- names(leadship) %in% c('q3','q4')
    4 newdata <- leadship[!myvars]

    8.条件筛选

    1 # 1.选择所有age大于等于35或者小于24的行,保留变量q1~q4
    2 # 2.选择所有25岁以上的男性,并保留gender到q4的所有列
    3 newdata <- subset(leadship,age>=35 | age < 24,select = c(q1,q2,q3,q4))
    4 
    5 newdata <- subset(leadship,gender='M' & age > 25,select = gender:q4)

    9.随机抽样

    1 # 从数据集中随机抽取出3行数据
    2 mysample <- leadship[sample(1:nrow(leadship),3,replace = F),]

    10.使用SQL操作数据集

    library(sqldf)
    newdf <- sqldf('select * from mtcars where carb=1 order by mpg',row.names = T)
    sqldf('select avg(mpg) as avg_mpg,avg(disp) as avg_disp,gear from mtcars where cyl in (4,6) group by gear' )

    案例2:一组学生参加了科学,数学,英语的考试,为了衡量学生的统一考试水平,前20%的学生为A,接下来20%的学生为B,以此类推,最后按照字母对学生进行排序

    1.准备数据

    1 options(digits = 2)
    2 Student <- c('John Davis','Angela Williams','Bullwinkle Moose','David Jones',
    3              'Janice Markhammer','Cheryl Cushing','Reuven Ytzrhak','Greg Knox',
    4              'Joel England','Mary Rayburn')
    5 Math <- c(502,600,412,358,495,512,410,625,573,522)
    6 Science <- c(95,99,80,82,75,85,80,95,89,86)
    7 English <- c(25,22,18,15,20,28,15,30,27,18)
    8 roster <- data.frame(Student,Math,Science,English,stringsAsFactors = F)

    2.转换考试成绩

    # 由于每门课程的得分不一致,所以将所有的成绩计算标准差来实现标准化
    z <- scale(roster[,2:4])

    3.计算成绩标准差的平均值

    # 1.通过mean计算每行的平均值
    # 2.使用cbind添加到数据集中
    score <- apply(z, 1, mean)
    roster <- cbind(roster,score)

    4.划分等级(A,B,C,D,F)

    1 y <- quantile(score,c(.8,.6,.4,.2))

    5.根据百分位运算符,创建新的变量等级

    1 roster$grade[score >= y[1]] <- 'A'
    2 roster$grade[score < y[1] & score >= y[2]] <- 'B'
    3 roster$grade[score < y[2] & score >= y[3]] <- 'C'
    4 roster$grade[score < y[3] & score >= y[4]] <- 'D'
    5 roster$grade[score < y[4]] <- 'F'

    6.把学生的姓名拆分成FirstName和LastName

    # 1.将该变量以空格的形式进行拆分
    # 2.获取第二个元素为LastName,第一个元素是FirstName
    # 3.将这两项组合到数据集中,并丢弃原始的姓名
    name <- strsplit((roster$Student),' ')
    Lastname <- sapply(name, '[',2)
    Firstname <- sapply(name, '[',1)
    roster <- cbind(Firstname,Lastname,roster[,-1])

    7.根据FirstName和LastName排序

    roster <- roster[order(Firstname,Lastname),]

     8.使用自定义函数(实现描述性统计量的计算)

     1 mystats <- function(x,parametric=T,print=F){
     2   if(parametric){
     3     center <- mean(x);spread <- sd(x)
     4   }
     5   else{
     6     center <- median(x);spread <- max(x)
     7   }
     8   if(print & parametric){
     9     cat('Mean=',center,'
    ','SD=',spread,'
    ')
    10   }
    11   else if(print & !parametric){
    12     cat('Median=',center,'
    ','MAD=',spread,'
    ')
    13   }
    14   result <- list(center=center,spread=spread)
    15   return (result)
    16 } 
    1 # 1.生成服从正态分布的500的随机样本
    2 # 2.执行语句,获取y$center和y$spread的值
    3 set.seed(1234)
    4 x <- rnorm(500)
    5 y <- mystats(x)
    # 1.或者获取中位数和mad的值
    y <- mystats(x,parametric = F,print = T)

    9.switch语句的实现

     1 mydate <- function(type='long'){
     2   switch (type,
     3     long = format(Sys.time(),'%A %B %d %Y'),
     4     short = format(Sys.time(),'%m-%d-%y'),
     5     cat(type,'is not a recognized type
    ')
     6   )
     7 }
     8 
     9 # 1.默认调用type为long的参数
    10 # 2.如果传short则调用short格式
    11 # 3.否则输出错误信息
    12 mydate('long')
    13 mydate('short')

    10.整合数据

    1 # 使用aggregate整合数据,第一个参数是数据集,第二个参数是要整合的列,第三个参数是使用什么函数进行行数据处理
    2 options(digits = 3)
    3 attach(mtcars)
    4 aggdata <- aggregate(mtcars,by = list(cyl,gear),FUN = 'mean',na.rm=T)
    5 aggdata
    6 detach(mtcars)
  • 相关阅读:
    带掩码的自编码器MAE详解和Pytorch代码实现
    联邦学习(Federated Learning)详解以及示例代码
    SIMILAR:现实场景中基于子模块信息度量的主动学习
    BERT 模型的知识蒸馏: DistilBERT 方法的理论和机制研究
    为什么 Pi 会出现在正态分布的方程中?
    快到周五了
    土豆
    忙碌的周末
    周五了
    写给妹妹的祝福语
  • 原文地址:https://www.cnblogs.com/luhuajun/p/8428876.html
Copyright © 2020-2023  润新知