给定输入向量 (iv)
iv <- c(.10,.15,"hello","."," . ",". ")
我正在使用:
out <- sub(regexp,NA,iv)
我想要这样的输出向量:
.10,.15,"hello",NA,NA,NA
但是,不知道如何形成正则表达式来获得我需要的东西。提前致谢。
您正在寻找的是negative lookahead
正则表达式。您要检查.
后面是否有 anumber (0-9)
并将其替换为NA
. 如果这个逻辑是你想要的,那么它可以在 1 行中实现如下:
gsub("\\.(?![0-9])", NA, iv, perl=T)
# [1] "0.1" "0.15" "hello" NA NA NA
逻辑:搜索后面没有数字的点并将其替换为NA
。
如果你想用NA
then 替换这些值,你将需要使用某种形式的赋值运算符。
一个简单的方法:
iv[gsub(" ", "", iv)=="."] <- NA
快速解释:
如果要替换的字符串都相同(即"."
),那么您可以简单地调用
iv[ iv=="."] <- NA
.
但是,为了捕捉所有多余的空格,您可以搜索无数的“。” 确保排除.10
,.15
等的组合,或者您可以删除所有空格,然后您可以使用更简单的情况==
。
顺便说一句,如果你想在 R 的正则表达式中搜索一个句点,你需要转义正则表达式的句点\.
,然后你需要转义R
,\\.
编辑:请注意,上面的行不会永久删除iv
. 看一下gsub(" ", "", iv)=="."
这会返回一个 T/F 向量,该向量又被用于过滤iv
. 除NA
数值外,iv
保持不变。
编辑#2: 如果您希望将更改保存到不同的向量,您可以使用以下内容:
out <- iv
out[gsub(" ", "", iv)=="."] <- NA
gsub('^\\s*[.]\\s*$', 'NA',c(.10,.15,"hello","."," . ",". "))
[1] "0.1" "0.15" "hello" "NA" "NA" "NA"
编辑将“ NA
”替换为NA
gsub('^\\s*[.]\\s*$', NA,c(.10,.15,"hello","."," . ",". "))
[1] "0.1" "0.15" "hello" NA NA NA
编辑使用stringr
library(stringr)
x <- c(.10,.15,"hello","."," . ",". ")
x[str_trim(x) == '.'] <- NA
x
[1] "0.1" "0.15" "hello" NA NA NA
正则表达式:
"^ *\. *$"