【问题标题】:unable to set number of digits after decimal using paste function (R)无法使用粘贴功能(R)设置小数点后的位数
【发布时间】:2017-09-18 10:51:58
【问题描述】:

我正在尝试将小数点后的位数设置为 1。 我已经完成了这个计算:

options(digits = 3)
DT<-data.table(x=c("a","b","c",NA,"b","e"),v=rnorm(6))
ans<-DT[,lapply(.SD,function(x) length(which(is.na(x)))/length(x)*100)]

现在,ans 给了我列中 NA 的百分比:

  x v
  16.7 0

但是当我尝试添加百分号“%”时:

ans[,lapply(.SD, function(x) paste(x,"%",sep = ''))]

十进制数字又回来了:

                    x   v
1: 16.6666666666667% 0%

我做错了什么?我怎样才能得到这个输出?:

 x v
 16.7% 0%

谢谢。

【问题讨论】:

  • 还有round,比如ans&lt;-DT[,lapply(.SD,function(x) round(length(which(is.na(x)))/length(x)*100, 1))],然后是你的最后一步。请注意,options(digits = 3) 控制打印的位数,而不是 R 为每个数字存储的位数。
  • 有用的解释,谢谢。

标签: r decimal paste


【解决方案1】:

我们可以使用sprintf,将其转换为两位小数,然后与%连接

DT[, lapply(.SD, function(x) sprintf("%0.1f%%", 100*sum(is.na(x))/.N))]

或者我们可以使用format

DT[, lapply(.SD, function(x) paste0(format(100*sum(is.na(x))/.N, digits = 3), "%"))]
#      x  v
#1: 16.7% 0%

【讨论】:

    【解决方案2】:

    您可以使用round 并执行以下操作:

    paste0(round(ans,1),"%")
    

    给了

    [1] "16.7%" "0%"   
    

    或将 OP 的代码更改为:

    ans[,lapply(.SD, function(x) paste(round(x,1),"%",sep = ''))]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多