我是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()函数?
你可以放回一些像这样的比赛:
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
您可以尝试此代码。我发现它很方便。
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)。
另一种思考方式是你想要保留什么?您可以使用正则表达式来保存信息以及省略信息。我有很多数据框需要清理单元,并在一次通过中从多行转换,我发现在这些实例中使用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)
然后将apply
与gsub
结合使用。
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