楼主: 十五弟
46309 14

[问答] 关于使用na.omit删除缺失值的问题 [推广有奖]

  • 1关注
  • 0粉丝

本科生

27%

还不是VIP/贵宾

-

威望
0
论坛币
54 个
通用积分
1.3500
学术水平
9 点
热心指数
9 点
信用等级
2 点
经验
3507 点
帖子
52
精华
0
在线时间
86 小时
注册时间
2015-8-3
最后登录
2023-4-10

楼主
十五弟 发表于 2016-5-9 16:13:22 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
今天发现个好玩的问题,如下:
  1. #创建一个数据框
  2. ID <- c(1,2,3,4)
  3. 省份 <- c("北京", "上海", "广州", "深圳")
  4. 月份 <- c(2,5,8,6)
  5. shiyan <- data.frame(ID, 省份, 月份)
复制代码
下面开始使用table()函数进行汇总:
  1. #按月汇总
  2. aa <- table(shiyan[,3])
复制代码
  1. #设置缺失值
  2. shiyan[shiyan == 5] <- NA
  3. #删除含有缺失值的观测
  4. shiyan1 <- na.omit(shiyan)
  5. #使用table()汇总月度数据
  6. table(shiyan1[,3])
复制代码
这时你会发现,明明已经删除了缺失值那行,但是table()还是给出了统计,不过值为0.
问题来了,缺失值已经删除的行不想出现在统计项中,而我还想实现月度数据的汇总,请问如何实现?
二维码

扫码加我 拉你入群

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

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

关键词:MIT 缺失值 好玩的 数据框

回帖推荐

马甲1号 发表于8楼  查看完整内容

问题出在如下语句: 这样赋值会使这个向量自动转换成字符串向量,再把它赋值给data.frame时,R又自作主张地把字符串向量转化为因子。也就是说: 第三列变成factor向量了,共有#N/A 1 3 5四个因子水平。然后 这样只是使第三列相应位置的值赋值为NA,但这并不影响因子的levels(因子的Levels可以看成是因子向量的模板,改变因子向量值一般不会改变相应的Level)。因此后面调用table的时候,table还是会遍历每一个level水 ...

沙发
jiangbeilu 学生认证  发表于 2016-5-9 17:05:11
问题1.png
你说的问题,并没有在我的R里出现呃
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
十五弟 + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
十五弟 发表于 2016-5-9 22:50:08
jiangbeilu 发表于 2016-5-9 17:05
你说的问题,并没有在我的R里出现呃
难道是因为我用的是RStudio?
再请教个问题,从.csv文件导入的数据集空值的项,在R里面不是缺失值NA,要如何筛选出空值并删除这些含空值的观测呢?

板凳
jiangbeilu 学生认证  发表于 2016-5-9 23:22:05
十五弟 发表于 2016-5-9 22:50
难道是因为我用的是RStudio?
再请教个问题,从.csv文件导入的数据集空值的项,在R里面不是缺失值NA,要 ...
read.csv里有个na.strings设置一下就可以了
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
十五弟 + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

报纸
十五弟 发表于 2016-5-9 23:41:10
jiangbeilu 发表于 2016-5-9 23:22
read.csv里有个na.strings设置一下就可以了
你好,谢谢深夜还回答我的疑问,我的处理方法是在.csv文件里筛选出空值填充为NA,再导入R的时候直接就是缺失值NA了,这时用table()也不会出现统计空值的情况。
您说的设置方式我明天再尝试一次,另外我会再看看之前为什么对删除的观测依然进行统计,谢谢指导!

地板
十五弟 发表于 2016-5-10 22:39:34
jiangbeilu 发表于 2016-5-9 17:05
你说的问题,并没有在我的R里出现呃
是我的描述有问题,问题没有出现在na.omit()上,而是NA和<NA>的不同上。若为NA,则na.omit()可以删除该行,若为<NA>,则显示时已删除,table()统计时还有这行。具体代码如下:
  1. >ID <- c(1,2,3,4)
  2. > 省份 <- c("河北", "山西", "江西", "福建")
  3. > 月份 <- c(3,5,"#N/A",1)
  4. > shiyan <- data.frame(ID, 省份, 月份)
  5. > shiyan
  6.   ID 省份 月份
  7. 1  1 河北    3
  8. 2  2 山西    5
  9. 3  3 江西 #N/A
  10. 4  4 福建    1
  11. > shiyan[shiyan == "#N/A"] <- NA
  12. > shiyan
  13.   ID 省份 月份
  14. 1  1 河北    3
  15. 2  2 山西    5
  16. 3  3 江西 <NA>
  17. 4  4 福建    1
  18. > shiyan[shiyan == "江西"] <- NA
  19. > shiyan
  20.   ID 省份 月份
  21. 1  1 河北    3
  22. 2  2 山西    5
  23. 3  3 <NA> <NA>
  24. 4  4 福建    1
  25. > aa<- na.omit(shiyan)
  26. > table(aa[,2])

  27. 福建 河北 江西 山西
  28.    1    1    0    1
  29. > aa
  30.   ID 省份 月份
  31. 1  1 河北    3
  32. 2  2 山西    5
  33. 4  4 福建    1
复制代码
请问NA和<NA>的区别是什么?

7
jiangbeilu 学生认证  发表于 2016-5-11 08:36:24
十五弟 发表于 2016-5-10 22:39
是我的描述有问题,问题没有出现在na.omit()上,而是NA和的不同上。若为NA,则na.omit()可以删除该行,若 ...
您好,有<NA>,用na.omit删除后,再用table是不会显示<NA>项的。

8
马甲1号 发表于 2016-5-12 16:50:33
十五弟 发表于 2016-5-10 22:39
是我的描述有问题,问题没有出现在na.omit()上,而是NA和的不同上。若为NA,则na.omit()可以删除该行,若 ...
问题出在如下语句:
  1. 月份 <- c(3,5,"#N/A",1)
复制代码

这样赋值会使这个向量自动转换成字符串向量再把它赋值给data.frame时,R又自作主张地把字符串向量转化为因子。也就是说:

  1. > shiyan[,3]
  2. [1] 3    5    #N/A 1   
  3. Levels: #N/A 1 3 5
复制代码
第三列变成factor向量了,共有#N/A 1 3 5四个因子水平。然后
  1. > shiyan[shiyan == "#N/A"] <- NA
复制代码

这样只是使第三列相应位置的值赋值为NA,但这并不影响因子的levels(因子的Levels可以看成是因子向量的模板,改变因子向量值一般不会改变相应的Level)。因此后面调用table的时候,table还是会遍历每一个level水平给出计数,也就是#N/A会出现在统计中的原因。

所以R里面的自动cast机制很容易导致bug,这也是动态语言的通病。



已有 1 人评分学术水平 热心指数 信用等级 收起 理由
十五弟 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

9
十五弟 发表于 2016-5-12 21:52:41
马甲1号 发表于 2016-5-12 16:50
问题出在如下语句:

这样赋值会使这个向量自动转换成字符串向量,再把它赋值给data.frame时,R又自作 ...
谢谢您的回答,请问自动cast机制是指什么?我不太明白

10
马甲1号 发表于 2016-5-13 11:15:42
十五弟 发表于 2016-5-12 21:52
谢谢您的回答,请问自动cast机制是指什么?我不太明白
这方面可以看看advance R相关介绍(http://adv-r.had.co.nz/Data-structures.html#vectors),Hadley Wickham是R语言大神。

根据advance R的说法,由于一个vector中的元素必须类型相同,因此构建vector的时候,R会自动按照“灵活性”排序把一个vector中的变量转换为满足最低灵活性的类型(灵活性排序:逻辑<整型<浮点<字符串)

比如c(1,TRUE)自动转换为c(1,1),
c(1,TRUE,2.0)转换成c(1.0,1.0,2.0),  
c(1,TRUE,2.0,"na")则转换成 c("1","TRUE","2.0","na")
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
十五弟 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 00:14