在R中,除了最后一个点之外,删除字符串中的所有点

6

我有一个像这样的字符串列表:

mystr <- c("16.142.8",          
       "52.135.1",         
       "40.114.4",          
       "83.068.8",         
       "83.456.3",         
       "55.181.5",         
       "76.870.2",         
       "96.910.2",         
       "17.171.9",         
       "49.617.4",         
       "38.176.1",         
       "50.717.7",         
       "19.919.6")

我知道第一个点 . 只是千位分隔符,而第二个点是十进制运算符。

我想将字符串转换为数字,所以第一个应该变成16142.8,第二个52135.1,依此类推。

我怀疑这可以用正则表达式来完成,但我不确定如何操作。有什么想法吗?

2个回答

10
你需要一个基于前瞻的 PCRE 正则表达式,配合 gsub 使用:
gsub("\\.(?=[^.]*\\.)", "", mystr, perl=TRUE)

点击查看在线 R 演示

详细说明

  • \\. - 表示一个点
  • (?=[^.]*\\.) - 匹配0个或多个非点字符(用[^.]*匹配),后面紧跟一个字面点。正则表达式中的 (?=...)是表示正向先行断言,在当前位置向右,必须包含参数里的表达式。但它不会出现在匹配结果中,同时保持正则表达式索引不变,即不会消耗掉匹配项。

2
另外,我猜负向前瞻也可以:gsub("[.](?!\\d+$)", "", mystr, perl=TRUE) - Frank
1
@Frank:是的,它将匹配任何不跟随1个或多个数字和字符串结尾的点。 - Wiktor Stribiżew

8
一个简单的“sub”就可以达到相同的效果,因为它只会替换第一个匹配模式。例如,
sub("\\.", "", mystr)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接