在矢量中应用正则表达式

时间:2014-03-11 06:39:59

标签: regex r vector apply

我不知道为什么以下代码不起作用。目的是输入一个字符串向量,其中一些可以转换为数字,有些则不能。以下'sapply'函数应使用正则表达式匹配数字,然后返回数字或(如果不是)返回原始数据。

sapply(c("test","6","-99.99","test2"), function(v){
  if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$",v)){as.numeric(v)} else {v}
})

返回以下结果:

"test"      "6" "-99.99"  "test2" 

编辑:我希望代码返回的内容:

"test"      6  -99.99    "test2

我可以成功地在每个元素上运行if语句。

> if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$","test")){as.numeric("test")} else {"test"}
[1] "test"
if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$","6")){as.numeric("6")} else {"6"}
[1] 6

等......

我不明白为什么会这样。我想我有两个问题。一:为什么会这样?还有两个:通常我很擅长排除故障,但我不知道在哪里找到它。如果您知道问题,您是如何找到/了解解决方案的?我应该打开内部lapply功能代码吗?

2 个答案:

答案 0 :(得分:2)

发生这种情况是因为sapply返回了一个向量,并且无法混合向量。如果您使用lapply,那么您会得到一个可以混合的列表结果,但使用lapply而不是sapply的相同代码可以按照您的意愿运行。

答案 1 :(得分:2)

@Jeremy指向正确的方向,你可以使用lapply,它返回一个列表。或者,您可以告诉sapply不要简化结果。

  

如果发生简化,则输出类型由   层次结构中返回值的最高类型NULL<原始<   逻辑<整数<双<复杂<字符<列表<表达,   在将骑士列入名单之后。

out <- sapply(c("test","6","-99.99","test2"), function(v){

  if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$",v)){
    as.numeric(v)
  } else {
    v
  }
}, simplify = FALSE)
> out
$test
[1] "test"

$`6`
[1] 6

$`-99.99`
[1] -99.99

$test2
[1] "test2"