zoukankan      html  css  js  c++  java
  • R_Studio(学生成绩)使用cbind()函数对多个学期成绩进行集成

      “Gary1.csv”、“Gary2.csv”、“Gary3.csv”中保存了一个班级学生三个学期的成绩

      对三个学期中的成绩数据进行集成并重新计算综合成绩和排名,并按排名顺序排布(学号9位数111304001~11304047)

      Gary1.csv中数据

      

      Gary2.csv中数据

      

       Gary3.csv中数据

      

      cbind是根据列进行合并  (要求:所有数据行数相等)

      rbind是根据行进行合并  (要求:所有数据列数相同)

      

    #打开工作目录文件
    setwd('D:\data')
    
    list.files()
    
    inputfile1=read.csv(file="Gary1.csv",header=TRUE)
    inputfile2=read.csv(file="Gary2.csv",header=TRUE)
    inputfile3=read.csv(file="Gary3.csv",header=TRUE)
    
    #删除inputfile1中的综合成绩和排名,删除inputfile2中的学号、姓名、综合成绩和排名
    result=cbind(inputfile1[,-c(10,11)],inputfile2[,-c(1,2,12,13)]) #数据集列合并
    
    #同理
    result2=cbind(result,inputfile3[,-c(1,2,7,8)])
    
    #对学生成绩进行相加,得到一组数据(我自己测试学生成绩是从第三列到第二十二列的)
    #相加成绩保存到evaluation中
    evaluation=apply(result2[,3:22], 1,mean,na.rm=TRUE)
    
    #apply函数一般有三个参数
    #第一个参数代表矩阵对象
    #第二个参数代表要操作矩阵的维度 1表示对行进行处理,2表示对列进行处理
    #第三个参数就是处理数据的函数
    #apply会分别一行或一列处理该矩阵的数据。
    
    #将evaluation用“综合测评”添加到resule2中,将结果用result11保存
    result11=data.frame(result2,'综合测评'=evaluation)
    
    #对result11中按综合测评成绩进行decreasing减少量排名
    result22=result11[order(result11$综合测评,decreasing = TRUE), ]
    
    result33=data.frame(result22,'测评排名'=order(result22$综合测评,decreasing = TRUE))
    
    result33
    Gary.R

      

    实现过程

      apply函数三个参数:

      第一个参数代表矩阵对象
      第二个参数代表要操作矩阵的维度 1表示对行进行处理,2表示对列进行处理
      第三个参数就是处理数据的函数

      读取文件数据保存到inputfile中

    inputfile1=read.csv(file="Gary1.csv",header=TRUE)
    inputfile2=read.csv(file="Gary2.csv",header=TRUE)
    inputfile3=read.csv(file="Gary3.csv",header=TRUE)

      删除inputfile1中的综合成绩和排名,删除inputfile2,inputfuke3中的学号、姓名、综合成绩和排名(合并数据后这些数据多余了)

    result=cbind(inputfile1[,-c(10,11)],inputfile2[,-c(1,2,12,13)]) #数据集列合并
    
    result2=cbind(result,inputfile3[,-c(1,2,7,8)])

      计算学生成绩并将所得结果添加到学生表中

    evaluation=apply(result2[,3:22], 1,mean,na.rm=TRUE)
    
    #将evaluation用“综合测评”添加到resule2中,将结果用result11保存
    result11=data.frame(result2,'综合测评'=evaluation)
    
    #对result11中按综合测评成绩进行decreasing减少量排名
    result22=result11[order(result11$综合测评,decreasing = TRUE), ]
    
    result33=data.frame(result22,'测评排名'=order(result22$综合测评,decreasing = TRUE))
    
    result33

      当R数据中存在NA时,使用对数据的mean()函数时需要注意NA问题

         x<-c(1,2,3,NA,4,5)

        y<-mean(x)

          因为x中有NA,所以当对x进行mean操作时,y会被赋值为NA 
      
            通过在函数中加“na.rm=TRUE”可以除NA的干扰

      

      对学生成绩异常值检测  传送门  

      修改上列代码28行

    evaluation=apply(result2[,3:22], 1,mean)

       

       补充:merge()函数  传送门

      merge 连接两个数据,官方参考文档语法 

    merge(x, y, by = intersect(names(x), names(y)),
          by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
          sort = TRUE, suffixes = c(".x",".y"),
          incomparables = NULL, ...)
      merge(x,  y,  by,  by.x,  by.y, all,  all.x,  all.y...)
     
    参数解释:
     
      x,y:需要合并的数据集
     
      by:用于连接两个数据集的列,当两个数据集公共列名相同,可以写成by = "公共列名"
     
      by.x、by.y:用于指定依据哪个列合并,常用于当两个数据集公共列名不一样的时候;
     
      all、all.x、all.y:指定x和y的行是否应该全部输出
     
      sort:是否需要排序

     

      merge()函数是对数据进行交并补运算,三张表进行数据合并时可先合并第一第二张表,再用所合成结果对第三张表进行合成

      测试a和aa中值的不同

    setwd('D:\data')
    
    list.files()
    
    inputfile1=read.csv(file="Gary1.csv",header=TRUE)
    inputfile2=read.csv(file="Gary2.csv",header=TRUE)
    inputfile3=read.csv(file="Gary3.csv",header=TRUE)
    
    #删除inputfile1中的综合成绩和排名,删除inputfile2中的学号、姓名、综合成绩和排名
    result=cbind(inputfile1[,-c(10,11)],inputfile2[,-c(1,2,12,13)]) #数据集列合并
    
    #同理
    result2=cbind(result,inputfile3[,-c(1,2,7,8)])
    
    
    a=merge(inputfile1,inputfile2,by=c("学号","课程名称"))
    aa=merge(inputfile1,inputfile2,by=c("学号","课程名称","综合排名"))
    b=merge(a,inputfile3,by=c("学号","课程名称"))

      发现aa中存在一个人成绩存在多个综合测评、综合排名的缺陷,把a也添加到by=c("学号","课程名称","综合排名")当中

     

      只要第一个学期和第二个学期综合排名不一样时,不显示合并成功的数据!!!

      

      merge()函数对数据的操作还是挺严格的!!!

    (如需转载学习,请标明出处)
  • 相关阅读:
    DripRoad(点滴之路)
    如何写优雅的代码
    .Net 一直在改变
    Protobufnet的完美解决方案
    关于msgpack序列化后的消息包是否再压缩
    失眠
    创建一个比微软性能更好空间更少的GUID
    msgpack与protobuf的简单性能测试对比
    分布式游戏服务器的登陆流程
    对象池的实现与性能测试
  • 原文地址:https://www.cnblogs.com/1138720556Gary/p/9697445.html
Copyright © 2011-2022 走看看