我有以下数据框:
> 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 执行此操作的最简单方法是检查
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
下面的代码使用正则表达式来确认 on 的字符串包含数字并且至少有一个数字。 见下图:
grepl("^[0-9]{1,}$", xx)
或者如果您需要处理负数和小数位:
grepl("^[-]{0,1}[0-9]{0,}.{0,1}[0-9]{1,}$", xx)
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。
您可以使用
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
像这样只检查过滤后结果行数怎么样?
library(tidyverse)
ddf = data.frame(name=c('a','b'), value=c(10,20))
t <- ddf %>% filter(name == "c")
nrow(t) == 0
[1] TRUE