删除字符向量的部分

时间:2017-09-18 07:39:52

标签: r regex

我有一个看起来像这样的字符向量

"9/14/2007,,,,88.22"  "9/21/2007,,,,92.53"  "9/28/2007,,,,92" "10/5/2007,,,,92.85"

现在我需要删除4个逗号之前的所有元素。所以最后看起来应该是这样的

"88.22"   "92.53"   "92"      "92.85"

我尝试过以下代码

gsub("[^0-9.]", "", x)

其中x是我的字符向量,但这会保留逗号之前的整数(即日期)。

"914200788.22"   "921200792.53"   "928200792"      "105200792.85"

此外,要删除的元素数量始终不相同,但最后一个要删除的元素始终是最后一个逗号。也许这对解决方案有帮助。

3 个答案:

答案 0 :(得分:2)

你的正则表达式只删除非数字字符。尝试替换之前的所有内容,包括四个逗号:

> vec = c("9/14/2007,,,,88.22",   "9/21/2007,,,,92.53",   "9/28/2007,,,,92",      "10/5/2007,,,,92.85")
> sub(".*,,,,", "", vec)
[1] "88.22" "92.53" "92"    "92.85"

答案 1 :(得分:0)

stringr str_extract

string = c("9/14/2007,,,,88.22",  "9/21/2007,,,,92.53",  "9/28/2007,,,,92", "10/5/2007,,,,92.85")

library(stringr)
str_extract(string, "\\d+[.]?\\d+$")

str_extract(string, "(?<=,{4}).*")

基础R 等价物:

unlist(regmatches(string, gregexpr("\\d+[.]?\\d+$", string)))

unlist(regmatches(string, gregexpr("(?<=,{4}).*", string, perl = TRUE)))

sapply(str_split(string, ",,,,"), `[`, 2)

备注:

  1. $匹配字符串
  2. 的结尾
  3. (?<=,{4})是一个积极的外观,可以在 4个逗号之后检查.*是否为。这需要perl正则表达式,这就是第二个Base R示例需要perl = TRUE的原因。

答案 2 :(得分:0)

将矢量作为csv读取,然后参考该列。为了得到最后一个,而不知道有多少原始列,我们可以反转它并采取第一个。

rev(read.table(text = x, sep = ","))[[1]]
# [1] 88.22 92.53 92.00 92.85

数据:

x <- scan(text='"9/14/2007,,,,88.22"  "9/21/2007,,,,92.53"  "9/28/2007,,,,92" "10/5/2007,,,,92.85"', what="")