1

我有一个问题,我希望有任何关于如何使用 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)$ \\\\", 
 )

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

我尝试使用gsubwith\\....来识别包含句点后跟其他三个数字的字符串,但这也为我提供了变量名称,a.name在我的示例中。

有谁知道我怎样才能完成我想做的事情?

提前致谢!

4

2 回答 2

3

这使用基数 R 的gregexpr, regmatches, 和regmatches<-对任何带有小数部分的数字进行四舍五入。

即使对于像.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)$ \\\\"
于 2013-11-05T19:34:27.853 回答
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) $  \\\\"
于 2013-11-05T19:10:29.787 回答