专栏首页生信技能树学徒讨论-在数据框里面使用每列的平均值替换NA

学徒讨论-在数据框里面使用每列的平均值替换NA

最近学徒群在讨论一个需求,就是用数据框的每一列的平均数替换每一列的NA值。但是问题的提出者自己的代码是错的,如下:

他认为替换不干净,应该是循环有问题。希望我们帮忙检查,我通常是懒得看其他人写的代码,所以让群里的小伙伴们有空的都尝试写一下。

答案一:双重for循环

我同样是没有细看这个代码,但是写出双重for循环肯定是没有理解R语言的便利性。

#我好像试着写出来了,上面的这个将每一列的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))
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)
  }
}

答案的提出者自己还点评了一句:我是这么想的,也不知道对不对,希望各位老师能指正一下:因为tmp数据框中,NA个数不唯一,我还想获取他们的横坐标的话,输出的结果就为一个list而不是一个数据框了。所以我在全局环境里面设置了一个空的list,然后每一列占据了list的一个元素的位置。list的每个元素里面包括了NA的横坐标。

答案二:使用Hmisc的impute函数

我给出的点评是:这样的偷懒大法好!使用Hmisc的impute函数可以输入指定值来替代NA值做简单插补,平均数、中位数、众数。

rm(list = ls())
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))
library(Hmisc)
me1=as.data.frame(apply(tmp, 2, function(x){
  impute(x,mean)}))

最后一个也是很差的答案

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))

#ifelse(is.na(tmp),apply(tmp,2,mean,na.rm=T))
tmp <- rbind(tmp,apply(tmp, 2, mean,na.rm=T))
for (i in 1:dim(tmp)[2]) {
  tmp[,i][is.na(tmp[,i])] <- tmp[nrow(tmp),i]
}
tmp

我的答案

不知道为啥,大家好像一直无法get到R语言编程的便利性!

a=1:1000
a[sample(a,100)]=NA
dim(a)=c(20,50)
a
# 按照列,替换每一列的NA值为该列的平均值
b=apply(a,2,function(x){
  x[is.na(x)]=mean(x,na.rm = T)
  return(x)
})

大家可以对比一下,看看自己的R语言水平停留在哪一个答案的水平

学徒作业

meltdcast函数,自己写一遍自定义函数实现同样的功能,就数据框的长-宽转换!

本文分享自微信公众号 - 生信技能树(biotrainee),作者:生信技能树

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 不同的GSE数据集有不同的临床信息,不同的分组技巧

    Jimmy大神怎么说过,只有多做、多错,才能真正的掌握。所以下面通过几个实战来说明。

    生信技能树
  • 一个MIT的博士要离开学术圈,结果······

    在过去的12年间,我一直从事着科学研究和教学工作,而且我也乐于其中。然而,就在几个星期以前,我辞掉了MIT的博士后职位,放弃了长久以来追寻的学术梦想。随后,我觉...

    生信技能树
  • TCGA数据库里面你的基因生存分析不显著那就TMA吧

    f. Kaplan-Meier survival curves of overall survival in 180 bladder cancer patien...

    生信技能树
  • GBS hapmap 格式 转化为Plink格式方法

    进行重测序或者GBS时,hapmap 是比较常见的格式,生信中经常使用这种格式。但是在GWAS和GS中,数据筛选,质控,构建矩阵都是使用的plink的格式。本文...

    邓飞
  • R语言-缺失值(一)

    大部分统计方法都假定处理的是完整向量、矩阵、数据框,但是在大多数情况下,在处理真实数据之前 不得不消除缺失值数据:(1)删除含有缺失值的实例;(2)用合理的值替...

    黑妹的小屋
  • R语言naniar包(新名词:阴影矩阵;Shadow matrices)

    因为ggplot2不能处理缺失值,所以我们得到了一个warning message ,我们可以使用geom_miss_point() 去展示缺失数据。

    用户1359560
  • 数据处理第一节:选取列的基本到高级方法选取列列名

    博客原文:https://suzan.rbind.io/2018/01/dplyr-tutorial-1/ 作者:Suzan Baert

    用户1359560
  • R语言第二章数据处理⑥dplyr包(1)列选取目录选取列

    =========================================

    用户1359560
  • TidyFriday 每天 5 分钟,轻轻松松上手 R 语言(五)

    今天我们依旧利用 msleep 数据集来探讨 dplyr 的列筛选,并在最后补充几个行筛选的例子。

    王诗翔呀
  • R语言第二章数据处理⑦dplyr包(2)列处理目录列名

    还有另一个选项可以避免连续重新输入列名:one_of()。 您可以预先设置列名,然后在select()语句中通过将它们包装在one_of()中或使用!!运算符来...

    用户1359560

扫码关注云+社区

领取腾讯云代金券