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

问题描述 投票:0回答:5

我有以下数据框:

> 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 是否是有效数字而不是“numeric(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'
,因此不会返回任何值。我想检测这个。

r
5个回答
13
投票

使用基数 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

9
投票

下面的代码使用正则表达式来确认 on 的字符串包含数字并且至少有一个数字。 见下图:

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

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

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

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

这结合了两个测试。 首先,它检查

xx
是否具有类
numeric
integer
也可以,因为底层检查是由
is.numeric
完成的),其次它检查
xx
的长度是否为 1。


0
投票

您可以使用

is.number()
包中的
assertthat
函数轻松完成此操作(确保使用 0.2.1 版本)。此函数检查变量是否为数字且长度为 1。

library(assertthat)
see_if(is.number(3))
#> [1] TRUE
see_if(is.number(numeric(0)))
#> [1] FALSE
#> attr(,"msg")
#> [1] "numeric(0) is not a number (a length one numeric vector)."
see_if(is.number("3"))
#> [1] FALSE
#> attr(,"msg")
#> [1] "\"3\" is not a number (a length one numeric vector)."

创建于 2024 年 12 月 19 日,使用 reprex v2.1.1


-2
投票

像这样只检查过滤后结果行数怎么样?

library(tidyverse)
ddf = data.frame(name=c('a','b'), value=c(10,20))
t <- ddf %>% filter(name == "c")
nrow(t) == 0
[1] TRUE
© www.soinside.com 2019 - 2024. All rights reserved.