从字符串向量中提取非负数或返回负数

时间:2018-10-01 13:10:41

标签: r data-conversion

我需要从字符串中提取非负数,如果未提取数字,则返回负数。

为了提取数字,我发现了以下方法:

> grep("^[0-9.]+","1234.1234alsk",value=TRUE)
[1] "1234.1234alsk"

如果给定的字符串不是数字,则返回空字符串:

> grep("^[0-9.]+","",value=TRUE)
character(0)

现在,我想使用以下类型的函数将空字符串替换为某些代理服务器编号,例如0-1

> sub("^$","-1","")
[1] "-1"

但是,如果我将该函数应用于空字符串character(0),则不会得到预期的结果:

> sub("^$","-1",grep("^[0-9.]+","",value=TRUE))
character(0)

问题是grep返回character(0)而不返回""。然后,因为subcharacter(0)""的工作方式不同,所以我没有获得所需的值"-1",而没有得到character(0)的期望值。结果,这些值将在以下查询中删除:

> v <- c("0","","1","2")
> as.numeric(sub("^$","-1",grep("^[0-9.]+",v,value=TRUE)))
[1] 0 1 2

我如何使用单线转换呢?

1 个答案:

答案 0 :(得分:1)

通过预加载stringr,我发现以下一个衬里提取了第一次出现的数字:

> library(stringr)
> x <- c("","1","1.23","1.23a","-123")
> as.vector(ifelse(is.na(str_match(x,"^[0-9.]+")),"-1",str_match(x,"^[0-9.]+")))
[1] "-1"   "1"    "1.23" "1.23" "-1"  

因此,我可以单线执行以下转换:

> as.numeric(as.vector(ifelse(is.na(str_match(x,"^[0-9.]+")),"-1",str_match(x,"^[0-9.]+"))))
[1] -1.00  1.00  1.23  1.23 -1.00
> all.is.numeric(as.numeric(as.vector(ifelse(is.na(str_match(x,"^[0-9.]+")),"-1",str_match(x,"^[0-9.]+")))))
[1] TRUE

转换存储在列字段中,因此,这里必须有单行要求。