检查变量是否是R中的数字

时间:2014-09-16 14:38:09

标签: r

我有以下数据框:

> ddf = data.frame(name=c('a','b'), value=c(10,20))
> ddf
  name value
1    a    10
2    b    20

我尝试使用以下命令从ddf获取xx:

> xx = ddf[ddf$name=='a','value']
> xx
[1] 10
> xx = ddf[ddf$name=='c','value']
> xx
numeric(0)

如何测试xx是否为有效数字而不是'数字(0)'。我试过以下:

> is.numeric(xx)
[1] TRUE
> is.na(xx)
logical(0)
> is.null(xx)
[1] FALSE
> is.logical(xx)
[1] FALSE

我必须从不同的xx = ddf[ddf$name=='a', 'value']数据框中询问ddf。有时ddf不包含'a',因此不会返回任何值。我想发现这个。

4 个答案:

答案 0 :(得分:9)

使用基数R执行此操作的最简单方法是检查xx的长度。

if(length(xx)>0)
  {
  <do something>
  }

如果要检查变量是否也是数字,请使用is.numeric

if (length(xx)>0 & is.numeric(xx))

例如,举个例子:

xx <- ddf[ddf$name=='a','value']

is.numeric(xx) & length(xx)>0
[1] TRUE


xx <- ddf[ddf$name=='c','value']

is.numeric(xx) & length(xx)>0
[1] FALSE


xx <- ddf[ddf$name=='a','name']

is.numeric(xx) & length(xx)>0
[1] FALSE

答案 1 :(得分:6)

library(assertive)
is_a_number(xx)          # returns TRUE or FALSE
assert_is_a_number(xx)   # throws an error if not TRUE

这结合了两个测试。首先,它检查xx是否具有类numericinteger也可以,因为基础检查由is.numeric完成),其次它检查xx的长度1}}是一个。

答案 2 :(得分:4)

以下代码使用正则表达式确认字符串on包含数字并且至少有一位数字。见下文:

ComparableAndLessThan

或者如果你需要处理负数和小数位:

grepl("^[0-9]{1,}$", xx)

答案 3 :(得分:-1)

这样的事情怎么样,您只需在过滤后检查结果行的数量?

library(tidyverse)
ddf = data.frame(name=c('a','b'), value=c(10,20))
t <- ddf %>% filter(name == "c")
nrow(t) == 0
[1] TRUE