更改R中字符串中的数字?

时间:2013-11-05 19:03:35

标签: regex string r gsub string-substitution

我有一个问题,我会很感激有关如何使用R的任何想法。问题是:我有一个乳胶表存储。表中的数字都配有小数点后的三位数字。我希望关闭这些数字,将其他数字留在表格中。 (想想代表估计结果的数字,但是尺寸为“美元”。然后,值145.553没有多大意义,145就足够了)。创建这些表格的人对此并没有太多考虑,所以我在这里试图避免手工完成这些表格。 :)

到目前为止,我只找到了如何从字符串中提取数字的不同解决方案,而不是如何更改它们,以便字符串本身不会改变。

示例:

 strings <- c(
 "a.name      & $-436.735  $   & $-710.832$   \\\\", 
 "std(a.name) & $(1403.604)$   & $(1274.283)$ \\\\", 
 )

解决方案应该返回

 strings <- c(
 "a.name      & $-436  $   & $-710$   \\\\", 
 "std(a.name) & $(1403)$   & $(1274)$ \\\\", 
 )

当然,如果可以正确地进行舍入,那么它会更好。但这不是最重要的。

我尝试将gsub\\....一起使用来识别包含句点后跟其他三个数字的字符串,但这也为我提供了变量名称a.name

有没有人知道如何才能完成我想做的事情?

提前致谢!

2 个答案:

答案 0 :(得分:2)

gsub(strings, pattern ="\\.[[:digit:]]{3}", replacement = "")
#[1] "a.name      & $-436  $   & $-710$   \\\\" "std(a.name) & $(1403)$   & $(1274)$ \\\\"

为了得到四舍五入,我会沿着这些线做点什么,但括号会让它变得有点难看 -

sapply(
  strsplit(
    strings,
    "\\$|\\$\\(|\\)\\$"
  ),
  function(x) 
    paste(
      x[1],'$',
      ifelse(as.numeric(x[2]) <0, round(as.numeric(x[2]),0),paste0("(",round(as.numeric(x[2]),0),")")),'$',
      x[3],'$',
      ifelse(as.numeric(x[4]) <0, round(as.numeric(x[4]),0),paste0("(",round(as.numeric(x[4]),0),")")),'$',
      x[5]
      )
)
#[1] "a.name      &  $ -437 $    &  $ -711 $    \\\\"   "std(a.name) &  $ (1404) $    &  $ (1274) $  \\\\"

答案 1 :(得分:2)

这使用基数R gregexprregmatchesregmatches<-来舍入带小数部分的任何数字。

即使对于像.789这样的数字(即小数点前没有数字)和-0.4(它应该舍入到没有减号的数字),它也能正常工作。理想情况下执行效果不佳的一种情况是,它不会从10.这样的数字中删除尾随小数。

string <- c("a.name      & $-436.735  $   & $-710.832$   \\\\", 
            "std(a.name) & $(1403.604)$   & $(1274.283)$ \\\\")

f <- function(x) {
    pat <- "(-)?[[:digit:]]+\\.[[:digit:]]*"
    m <- gregexpr(pat, x)
    regmatches(x,m) <- lapply(regmatches(x,m), function(X) round(as.numeric(X)))
    x
}

f(string)
# [1] "a.name      & $-437  $   & $-711$   \\\\"
# [2] "std(a.name) & $(1404)$   & $(1274)$ \\\\"