在R中,使用gsub删除除句点之外的所有标点符号

问题描述 投票:11回答:3

我是R的新手,所以我希望你能帮助我。

我想使用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()函数?

r replace gsub
3个回答
12
投票

你可以放回一些像这样的比赛:

 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

2
投票

您可以尝试此代码。我发现它很方便。

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"

此代码替换了不包含字母数字术语的所有内容。然后我们添加到例外列表中。这里我们添加连字符(\ - ),句号(\。)和空格(\ s)。


1
投票

另一种思考方式是你想要保留什么?您可以使用正则表达式来保存信息以及省略信息。我有很多数据框需要清理单元,并在一次通过中从多行转换,我发现在这些实例中使用apply系列中的东西最容易。

重新创建示例:

a <- c('1', '2@', '3', '4', '£5')
b <- c('6', '7.235', '8', '$9', '-10')
z <- matrix(data = c(a, b), nrow = length(a), ncol=2)

然后将applygsub结合使用。

apply(z, 2, function(x) as.numeric(gsub('[^0-9\\.\\-]', '', x)))
      [,1]    [,2]
[1,]    1   6.000
[2,]    2   7.235
[3,]    3   8.000
[4,]    4   9.000
[5,]    5 -10.000

这指示R匹配除数字,句点和连字符/短划线之外的所有内容。就个人而言,我觉得它在这些情况下更清洁,更容易使用,并提供相同的输出。

此外,文档对这些功能强大但令人困惑的正则表达式有很好的解释。

https://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html

或者?regex

© www.soinside.com 2019 - 2024. All rights reserved.