美文网首页
突然间,我感觉我喜欢上了for,真心好用!

突然间,我感觉我喜欢上了for,真心好用!

作者: LiuYueRR | 来源:发表于2019-12-21 17:27 被阅读0次

    今天健明大大的群里发布了一个小作业:数据框中的某一列存在NA,目的是想用数据框的每一列的平均数替换每一列的NA值。
    今天周六,下午给老板交代完任务以后,准备复习英语期末考试。
    不过说实话,我对英语实在是不感冒。
    恰巧有作业,借此机会可以少复习一会儿英语,说句实话心里还是美滋滋的。

    在作物栽培学,作物育种学,遗传学,生命科学等学科中,如果涉及到统计表型等等数据时,一般都会由人工进行统计,这样就会产生不可避免的人为误差。当有一些表型没有统计上时,就会出现漏写,空白值等等缺失值的状况。R中有一个特殊标准属于来表示缺失值,NA,也叫做Not Available(无效值)
    那么无效值一般如何剔除呢?

    #加上na.rm=T参数
    x <- c(2,NA,4)
    mean(x)
    mean(x,na.rm = T)
    #如果是数据框的话na.omit
    data_frame <- na.omit(data_frame)
    #直接删除掉数据框中含有NA的所有行
    

    但是,我现在要做的就是将每一列(变量)中的平均值,替换掉NA值。

    #创建一个数据框
    tmp <- data.frame(a=c(1:5,NA,6:9),
                      b=c(NA,sample(1:100,9)),
                      c=c(sample(1:50,3),NA,sample(1:50,4),NA,NA),
                      d=c(sample(1:40,9),NA),
                      e=c(sample(1:50,5),NA,NA,NA,NA,NA))
    #来个for循环
    out <- list()
    for (i in 1:ncol(tmp)) {
      out[[i]] <- which(is.na(tmp[,i]))
      for (y in 1:length(out[[i]])) {
        tmp[out[[i]][y],i] <- mean(tmp[[i]],na.rm = T)
      }
    }
    
    #既然可以用for 那么也可以用apply
    #apply也相当好用!
    b=apply(tmp,2,function(x){
      x[is.na(x)]=mean(x,na.rm = T)
      return(x)
    })
    

    原始数据框


    d5b24bb73330161c107ef6d594d1fc0.png

    结果数据框


    31643d4951c54f6a73318bfcc14fc1b.png

    主要的思路,还是希望能够获得到NA值的横纵坐标,然后再进行重新的赋值计算。

    当然各路大神肯定有各自的办法,因为解决一件事情的方法,千千万万。我能做的就是看着各位前辈的背影,努力学习。

    突然间,我感觉我喜欢上了for循环!真心好用!
    没有什么事情不是for循环解决不了的,如果有,那就上两个for。
    话不多说,背英语去了,希望这是我从小到大的最后一次正式的考试!

    相关文章

      网友评论

          本文标题:突然间,我感觉我喜欢上了for,真心好用!

          本文链接:https://www.haomeiwen.com/subject/xumgnctx.html