我有一个看起来像这样的字符向量
"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"
此外,要删除的元素数量始终不相同,但最后一个要删除的元素始终是最后一个逗号。也许这对解决方案有帮助。
答案 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)
备注:强>
$
匹配字符串(?<=,{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="")