我是新来的,所以我希望你能帮我。
我想使用gsub删除除句号和减号以外的所有标点符号,以便在数据中保留小数点和负号。
示例
我的数据框架z有以下数据:
[,1] [,2]
[1,] "1" "6"
[2,] "2@" "7.235"
[3,] "3" "8"
[4,] "4" "$9"
[5,] "£5" "-10"
我想使用gsub("[[:punct:]]", "", z)
删除标点符号。
电流输出
> gsub("[[:punct:]]", "", z)
[,1] [,2]
[1,] "1" "6"
[2,] "2" "7235"
[3,] "3" "8"
[4,] "4" "9"
[5,] "5" "10"
然而,我想保留"-“的标志和”。“签名。
期望输出
PSEUDO CODE:
> gsub("[[:punct:]]", "", z, except(".", "-") )
[,1] [,2]
[1,] "1" "6"
[2,] "2" "7.235"
[3,] "3" "8"
[4,] "4" "9"
[5,] "5" "-10"
有什么想法吗?如何使一些字符不受gsub()函数的约束?
发布于 2014-02-03 17:59:46
你可以放一些这样的火柴:
sub("([.-])|[[:punct:]]", "\\1", as.matrix(z))
X..1. X..2.
[1,] "1" "6"
[2,] "2" "7.235"
[3,] "3" "8"
[4,] "4" "9"
[5,] "5" "-10"
这里我保留了.
和-
。
我猜,下一步是强迫你得到一个数字矩阵,所以这里我把这两个步骤结合起来,如下所示:
matrix(as.numeric(sub("([.-])|[[:punct:]]", "\\1", as.matrix(z))),ncol=2)
[,1] [,2]
[1,] 1 6.000
[2,] 2 7.235
[3,] 3 8.000
[4,] 4 9.000
[5,] 5 -10.000
发布于 2019-04-23 05:05:27
你可以试试这段代码。我发现它很方便。
x <- c('6,345', '7.235', '8', '$9', '-10')
gsub("[^[:alnum:]\\-\\.\\s]", "", x)
[1] "6345" "7.235" "8" "9" "-10"
x <- c('1', '2@', '3', '4', '£5')
gsub("[^[:alnum:]\\-\\.\\s]", "", x)
[1] "1" "2" "3" "4" "5"
此代码{gsub(“[^:alnum:]”、"“、x)}删除所有不包括字母数字术语的内容。然后我们添加到异常列表中。这里我们添加连字符(-),句号(.)和获得gsub的空间(“[^:alnum:-.\s]”、"“、”x“)。现在,它删除了所有不是字母数字,连字符,句号和空格。
发布于 2020-03-03 20:00:22
下面是一些使用基R (g)sub
和stringr
移除/替换函数在R中限制泛型字符类的选项:
(g)sub
和 perl=TRUE
您可以将[[:punct:]]
括号表达式与[:punct:]
POSIX字符类一起使用,并将其限制为(?!\.)
负前瞻,这将要求右边后面的字符不等于.
。
(?!\.)[[:punct:]] # Excluding a dot only
(?![.-])[[:punct:]] # Excluding a dot and hyphen
若要匹配一个或多个事件,请将其包装为非捕获组,然后将+
量词设置为组:
(?:(?!\.)[[:punct:]])+ # Excluding a dot only
(?:(?![.-])[[:punct:]])+ # Excluding a dot and hyphen
注意,当删除找到的匹配时,这两个表达式将产生相同的结果,但是,当您需要用其他字符串/char替换时,量化将允许使用替换模式的单个出现来更改整个连续字符块。
stringr
替换/删除函数
在详细讨论之前,请注意,与(g)sub
一起使用的PCRE (g)sub
将不匹配由ICU regex库驱动的stringr
正则表达式中的相同字符。您需要使用[\p{P}\p{S}]
代替,请参阅R/regex与stringi/ICU:为什么'+‘被认为是非字符[:点:]字符?
ICU regex库有一个很好的特性,可以与字符类一起使用,称为字符类减法。
因此,您编写字符类,例如,所有标点符号匹配类(如[\p{P}\p{S}]
),然后要“排除”(=减去)一个字符或两个或三个字符,或一个字符的整个子类。您可以使用两个符号:
[\p{P}\p{S}&&[^.]] # Excluding a dot
[\p{P}\p{S}--[.]] # Excluding a dot
[\p{P}\p{S}&&[^.-]] # Excluding a dot and hyphen
[\p{P}\p{S}--[.-]] # Excluding a dot and hyphen
若要将1+连续事件与此方法匹配,不需要任何包装组,只需使用+
即可。
[\p{P}\p{S}&&[^.]]+ # Excluding a dot
[\p{P}\p{S}--[.]]+ # Excluding a dot
[\p{P}\p{S}&&[^.-]]+ # Excluding a dot and hyphen
[\p{P}\p{S}--[.-]]+ # Excluding a dot and hyphen
请参阅具有输出的r演示测试
x <- "Abc.123#&*xxx(x-y-z)???? some@other!chars."
gsub("(?!\\.)[[:punct:]]", "", x, perl=TRUE)
## => [1] "Abc.123xxxxyz someotherchars."
gsub("(?!\\.)[[:punct:]]", "~", x, perl=TRUE)
## => [1] "Abc.123~~~xxx~x~y~z~~~~~ some~other~chars."
gsub("(?:(?!\\.)[[:punct:]])+", "~", x, perl=TRUE)
## => [1] "Abc.123~xxx~x~y~z~ some~other~chars."
library(stringr)
stringr::str_remove_all(x, "[\\p{P}\\p{S}&&[^.]]") # Same as "[\\p{P}\\p{S}--[.]]"
## => [1] "Abc.123xxxxyz someotherchars."
stringr::str_replace_all(x, "[\\p{P}\\p{S}&&[^.]]", "~")
## => [1] "Abc.123~~~xxx~x~y~z~~~~~ some~other~chars."
stringr::str_replace_all(x, "[\\p{P}\\p{S}&&[^.]]+", "~") # Same as "[\\p{P}\\p{S}--[.]]+"
## => [1] "Abc.123~xxx~x~y~z~ some~other~chars."
https://stackoverflow.com/questions/21533899
复制相似问题