首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查subset()中定义的值

检查subset()中定义的值
EN

Stack Overflow用户
提问于 2011-07-07 05:53:50
回答 1查看 1.7K关注 0票数 3

尝试基于非空值从SQL借用数据框的子集。尝试一些类似的东西:

代码语言:javascript
复制
lately <- subset(data, year > 1997 & myvalue != NA)

但这是不对的。有什么建议吗,R‘’sters?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-07 05:57:51

代码语言:javascript
复制
subset(data, year > 1997 & !is.na(myvalue))

应该做这件事。你的版本不能工作的原因是foo != NAfoo == NA总是NA,因为我们不知道NA数据是什么。使用is.na()测试NA,如果您想要"not NA“,则使用!否定它。

例如:

代码语言:javascript
复制
> dat <- data.frame(year = 1995:2000, myvalue = c(1,3,4,NA,6,10))
> dat
  year myvalue
1 1995       1
2 1996       3
3 1997       4
4 1998      NA
5 1999       6
6 2000      10
> subset(dat, year > 1997 & myvalue != NA)
[1] year    myvalue
<0 rows> (or 0-length row.names)
> subset(dat, year > 1997 & !is.na(myvalue))
  year myvalue
5 1999       6
6 2000      10

进一步思考为什么你的版本不能工作是有指导意义的。

子句的第一部分返回:

代码语言:javascript
复制
> with(dat, year > 1997)
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE

对于前三个元素,我们不需要做任何进一步的检查,因为它们是假的,但我们需要检查示例中最后三个元素的第二个子句。第二个子句返回所有元素的NA,如上所述:

代码语言:javascript
复制
> with(dat, myvalue != NA)
[1] NA NA NA NA NA NA

因此,combined子句返回:

代码语言:javascript
复制
> with(dat, year > 1997 & myvalue != NA)
[1] FALSE FALSE FALSE    NA    NA    NA

这将不会选择任何行,因此为您的示例返回的零行对象。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6603531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档