我需要从字符串中提取非负数,如果未提取数字,则返回负数。
为了提取数字,我发现了以下方法:
> 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)
而不返回""
。然后,因为sub
与character(0)
和""
的工作方式不同,所以我没有获得所需的值"-1"
,而没有得到character(0)
的期望值。结果,这些值将在以下查询中删除:
> v <- c("0","","1","2")
> as.numeric(sub("^$","-1",grep("^[0-9.]+",v,value=TRUE)))
[1] 0 1 2
我如何使用单线转换呢?
答案 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
转换存储在列字段中,因此,这里必须有单行要求。