2

我想使用 2 位有效数字格式化数字formatC。但它有一个奇怪的行为。以下是数字:

(x <- data.frame(  cil = c(1.234, 0.444, 0.712, 0.999, 1.999)
                 , ciu = c(1.812, 1.234, 0.999, 1.199, 2.690)
                 )
 )

x$ci <- with(x,paste("("
              , formatC(cil, format="g", digits=2, flag="#")
              , "-"
              , formatC(ciu, format="g", digits=2, flag="#")
              ,")"
                      )
              )
x

结果如下:

      cil   ciu         ci
1     1.234 1.812  ( 1.2 - 1.8 )
2     0.444 1.234 ( 0.44 - 1.2 )
3     0.712 0.999 ( 0.71 - 1.0 )
4     0.999 1.199  ( 1.0 - 1.2 )
5     1.999 2.690  (  2. - 2.7 )

在案例 5 中,我期望2.0而不是2. . 对此有解释吗?我对参数的定义有什么问题吗?

4

2 回答 2

1

使用R 3.1.2on linux mint 17,我无法重现问题,因为我得到的结果与您预期的输出一样。但是,如果您有很多列(或一般情况下),这里有一个选项可以paste使用do.call

1)使用格式C

x$ci <- paste0("(",do.call(`paste`, c(lapply(x[,2:3], function(x) 
 formatC(x, format='g',   digits=2, flag='#')), list(sep=" - "))) ,")")
x$ci
#[1] "(1.2 - 1.8)"  "(0.44 - 1.2)" "(0.71 - 1.0)" "(1.0 - 1.2)"  "(2.0 - 2.7)" 

注意:以上是完全相同的预期输出。

2) 使用 sprintf

sprintf如果您需要与@CathG 在更新前显示的类似输出,我考虑的另一个选项是使用

x$ci <- paste0("(",do.call(`paste`, c(lapply(x[2:3], function(x) 
                       sprintf('%0.2f', x)), list(sep="-"))),")")
x$ci
#[1] "(1.23-1.81)" "(0.44-1.23)" "(0.71-1.00)" "(1.00-1.20)" "(2.00-2.69)"

更新

你可以regex用来解决问题。例如,我创建的5th条目与您的输出相同并使用正则表达式lookbehind

x$ci[5] <- "( 2. - 2.7 )"
sub('(?<=\\.) ', '0', x$ci, perl=TRUE)
#[1] "( 1.2 - 1.8 )"  "( 0.44 - 1.2 )" "( 0.71 - 1.0 )" "( 1.0 - 1.2 )" 
#[5] "( 2.0- 2.7 )"  
于 2014-12-19T10:01:09.177 回答
1

为了说明我在评论中所说的话,你可以这样做:

x$ci<-with(x,paste("(",
                   format(cil,digits=2,nsmall=2),
                   "-",
                   format(ciu,digits=2,nsmall=2),")"))
> x
  case   cil   ciu              ci
1    A 1.234 1.812 ( 1.23 - 1.81 )
2    B 0.444 1.234 ( 0.44 - 1.23 )
3    C 0.712 0.999 ( 0.71 - 1.00 )
4    D 0.999 1.199 ( 1.00 - 1.20 )
5    E 1.999 2.690 ( 2.00 - 2.69 )

或以下内容,以抑制括号之前或之后的空格:

x$ci<-with(x,paste0("(",
                    format(cil,digits=2,nsmall=2),
                    " - ",
                    format(ciu,digits=2,nsmall=2),")"))
> x
  case   cil   ciu          ci
1    A 1.234 1.812 (1.23 - 1.81)
2    B 0.444 1.234 (0.44 - 1.23)
3    C 0.712 0.999 (0.71 - 1.00)
4    D 0.999 1.199 (1.00 - 1.20)
5    E 1.999 2.690 (2.00 - 2.69)

注意:您实际上可以使用函数获得相同的结果,formatC但使用format="f"而不是"g".

更新 :

0我想在某些 R 版本中没有打印的事实2.只是一个错误(更奇怪的是:如果你尝试使用2.01而不是 的行1.999,你会得到"2.0"......)。

要使其与您的生产线一起工作并获得您想要的,只需添加round功能:

x$ci<-with(x,paste("(",
                    formatC(round(cil,2), format="g", digits=2, flag="#"),
                   "-",
                   formatC(round(ciu,2), format="g", digits=2, flag="#"),")"))

> x
  case   cil   ciu             ci
1    A 1.234 1.812  ( 1.2 - 1.8 )
2    B 0.444 1.234 ( 0.44 - 1.2 )
3    C 0.712 0.999 ( 0.71 - 1.0 )
4    D 0.999 1.199  ( 1.0 - 1.2 )
5    E 1.999 2.690  ( 2.0 - 2.7 )
于 2014-12-19T10:09:53.897 回答