楼主: xuxinzju
8283 8

[问答] 矩阵中NA值需要将其替换为它所在列的平均值 [推广有奖]

  • 0关注
  • 0粉丝

初中生

42%

还不是VIP/贵宾

-

威望
0
论坛币
16 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
245 点
帖子
10
精华
0
在线时间
8 小时
注册时间
2013-11-20
最后登录
2019-1-7

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
写完以后的结果总是出问题,算出平均值了,但是它会出问题,比如第3行第2列有个NA,他计算好第2列的平均值后,将其写到第3行第2列的NA了,但是把第3行第4,5列正常的数值也修改为刚刚求出的平均值了。。。不知道为什么啊。函数哪里写错了嘛?
for(i in 1:5){
a=mean(na.omit(data[,i]))
data[is.na(data[,i])]=a
}
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:平均值 Data mean 不知道 MIT 平均值

回帖推荐

cheetahfly 发表于6楼  查看完整内容

上面是顺着你的思路做的改进,在我的电脑上已经通过。 你原来代码中的问题存在于data)]=a这一句,你可以调试一下,is.na(data[,i])返回的是一个(FALSE FALSE TRUE FALSE FALSE)之类的向量,被data)]引用后,会自动循环补齐ncol(data)次,变成选定了第i列有空值的那一整行,并进行赋值,于是就出现了你反映的问题,变成data), i] 就能特指第i列,就能解决了。 这个错误再次反映了——矩阵本质就是向量。如果用向量化的思维去解 ...
沙发
jiangbeilu 学生认证  发表于 2015-10-28 23:56:26 |只看作者 |坛友微信交流群
  1. data[,is.na(data[,i])]=a
复制代码


少个, ,你那是提取的行,当然会出错

使用道具

藤椅
xuxinzju 发表于 2015-10-29 02:15:39 |只看作者 |坛友微信交流群
jiangbeilu 发表于 2015-10-28 23:56
少个, ,你那是提取的行,当然会出错
照你这样改之后报错了。
Error in `[<-`(`*tmp*`, , is.na(data[, i]), value = 5.84125874125874) :
  (subscript) logical subscript too long

使用道具

板凳
creaoplus 发表于 2015-10-29 04:29:42 |只看作者 |坛友微信交流群
for(i in 1:5){
  a=mean(na.omit(data[i,]))
  data[i,is.na(data[i,])]=a
}

使用道具

报纸
xuxinzju 发表于 2015-10-29 05:15:58 |只看作者 |坛友微信交流群
creaoplus 发表于 2015-10-29 04:29
for(i in 1:5){
  a=mean(na.omit(data))
  data)]=a
你这个就完全错了额。。我要的是把NA替换成为当列的平均值哦

使用道具

地板
cheetahfly 在职认证  发表于 2015-10-29 08:12:17 |只看作者 |坛友微信交流群
  1. for(i in 1:5) {
  2. a <- mean(data[, i], na.rm = T)
  3. data[is.na(data[, i]), i] <- a
  4. }
复制代码
上面是顺着你的思路做的改进,在我的电脑上已经通过。
你原来代码中的问题存在于data[is.na(data[,i])]=a这一句,你可以调试一下,is.na(data[,i])返回的是一个(FALSE FALSE TRUE FALSE FALSE)之类的向量,被data[is.na(data[,i])]引用后,会自动循环补齐ncol(data)次,变成选定了第i列有空值的那一整行,并进行赋值,于是就出现了你反映的问题,变成data[is.na(data[, i]), i] 就能特指第i列,就能解决了。

这个错误再次反映了——矩阵本质就是向量。如果用向量化的思维去解决这个问题,可以不用循环就能达成:(假设原数据是矩阵,且每列有且只有一个NA值)
  1. data[is.na(data)] <- colMeans(data, na.rm = T)
复制代码


使用道具

7
lzcllyt 发表于 2015-10-29 18:34:02 |只看作者 |坛友微信交流群
cheetahfly 发表于 2015-10-29 08:12
上面是顺着你的思路做的改进,在我的电脑上已经通过。
你原来代码中的问题存在于data)]=a这一句,你可以调 ...
太有启发了,学到了!

使用道具

8
creaoplus 发表于 2015-10-30 04:30:26 |只看作者 |坛友微信交流群
xuxinzju 发表于 2015-10-29 05:15
你这个就完全错了额。。我要的是把NA替换成为当列的平均值哦
对不起 把列看成行了。

使用道具

9
hzx21th 发表于 2015-10-30 10:34:01 |只看作者 |坛友微信交流群
假设数据框是dat,那么以下方法可以避免循环,虽然结果和楼上的是一样的
a<- colMeans(dat,na.rm = TRUE)
dat[is.na(dat)]<- a[ceiling(which(is.na(dat))/nrow(dat))]

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-17 22:47