Regex 在向量上应用正则表达式
我不知道为什么下面的代码不起作用。其目的是输入字符串向量,其中一些可以转换为数字,一些不能。以下“sapply”函数应使用正则表达式匹配数字,然后返回数字或(如果不是)返回原始数字Regex 在向量上应用正则表达式,regex,r,vector,apply,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
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
等等
我不明白为什么会这样。我想我有两个问题。第一:为什么会这样?第二:通常我很擅长故障排除,但我甚至不知道在哪里可以找到这个。如果你知道这个问题,你是如何找到/知道解决方法的?我应该打开内部lappy函数代码吗?这是因为
sapply
返回一个向量,并且向量不能混合。如果使用lappy
,则会得到一个可以混合的列表结果,使用lappy
而不是sapply
的相同代码可以按照您的意愿工作。这种情况是因为sapply
返回一个向量,而向量不能混合。如果您使用lappy
,那么您会得到一个可以混合的列表结果,相同的代码,但使用lappy
而不是sapply
可以按照您的意愿工作。@Jeremy指向正确的方向,您可以使用lappy,它返回一个列表。或者,您可以告诉sapply
不要简化结果
如果发生简化,则输出类型由
层次结构中返回值的最高类型NULLout
$test
[1] “测试”
$`6`
[1] 6
$`-99.99`
[1] -99.99
$test2
[1] “测试2”
@Jeremy指向正确的方向,您可以使用Lappy,它返回一个列表。或者,您可以告诉sapply
不要简化结果
如果发生简化,则输出类型由
层次结构中返回值的最高类型NULLout
$test
[1] “测试”
$`6`
[1] 6
$`-99.99`
[1] -99.99
$test2
[1] “测试2”
啊!非常感谢。我不知道这个事实是如何从我身边溜走的——直接在帮助中。Lappy将非常有效。sapply
也会返回一个列表。如果你问它。是的,但你基本上只是要求它是一个圈。聪明的人意味着简化的拉皮。啊!非常感谢。我不知道这个事实是如何从我身边溜走的——直接在帮助中。Lappy将非常有效。sapply
也会返回一个列表。如果你问它。是的,但你基本上只是要求它是一个圈。我的意思是简单的拉皮。
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"