语言数据框怎么每列求和_学徒讨论在数据框里面使用每列的平均值替换NA

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

99584472803f117332d0c3f20f835e94.png

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

答案一:双重for循环

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

#我好像试着写出来了,上面的这个将每一列的NA替换成每一列的平均值。
#代码如下,请各位老师瞅瞅有没有毛病。
tmp 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 for (i in 1:ncol(tmp)) {
  out[[i]]   for (y in 1:length(out[[i]])) {
    tmp[out[[i]][y],i] T)
  }
}

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

答案二:使用Hmisc的impute函数

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

rm(list = ls())
tmp 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 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 2, mean,na.rm=T))
for (i in 1:dim(tmp)[2]) {
  tmp[,i][is.na(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函数,自己写一遍自定义函数实现同样的功能,就数据框的长-宽转换!

学徒培养模式

常见:生信技能树超级VIP入场券发放(人民币一万起)

作为全网第一个全栈生信工程师,史上最大中文生物信息学交流社区-生信技能树联盟的创始人 jimmy,在这里第二次郑重宣布: 招学徒!

你可以先看看我是如何培养学徒的:

  • 七步走纯R代码通过数据挖掘复现一篇实验文章(第七步WGCNA)

  • 可能只是一个函数,却要耗费你大半天

  • 你要挖的公共数据集作者上传了错误的表达矩阵肿么办(如何让高手心甘情愿的帮你呢?)

  • 你可能不适合做人(学徒给我的6个暴击)

学徒培养模式已经走过了一个年头,期间约20名学徒成功出师:

  • 很多学徒出师后加入了我们生物信息学知识整理和分享的队伍,大家其实已经在生信技能树/生信菜鸟团/单细胞天地等公众号看到他们的身影

  • 一些学徒出师后成功从湿实验工作者转行成为了生信工程师

  • 几个学徒选择了生物信息学方向的读研出国深造

  • 几个学徒选择了入职我们公司,赞!

总体来说,是一个非常成功的技能教学培养模式,是一个很好的开局,预祝第二个年头做的更棒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值