将带负号的十进制数转换为固定宽度字符串

时间:2015-09-04 18:36:38

标签: r casting

我想将小数点坐标(例如-62.54879632547)转换为固定宽度的字符串,如下所示:

负数 - >领先0

正数 - >领先1

然后是整数部分的3位数

62 - > 062

2 - > 002

然后是小数点后的6位数(并删除小数)

.54879632547 - > 548796

最后的恢复:

-62.54879632547 - > 0062548796(即0 062 548796)

如何在R中快速有效地完成这项工作?

我已经完成了以下功能,但它很慢(当与数百万的值一起使用时):

     formatCoordinate <- function (x) {
      if (!is.na(x)) {
        sign <- ifelse(x < 0, 0, 1)
        castIntergerPart <- function (x) {
          #integer part should be exactly 3 digits with leading zeros if necessary 
          if (abs(x) < 10) {
            intgerPart <- paste0("00", abs(as.integer(x)))

          }else if (abs(x) >=10 & abs(x) < 100) {
            intgerPart <- paste0("0", abs(as.integer(x)))

          }else if (abs(x) >= 100) {
            intgerPart <- paste0(abs(as.integer(x)))
          }
        }

        castDecimalPart <- function(x) {
          s <- toString(x)
          sub(".*?.(.*?);.*", "\\1", s)
          substr(unlist(strsplit(s, split='.', fixed=TRUE))[2], 1, 6)
        }

        formattedCoordinate = paste0(sign, castIntergerPart(x), castDecimalPart(x))  
      }else{
        NA    
      } 
    }

感谢任何帮助

最好的

1 个答案:

答案 0 :(得分:2)

使用一些字符串格式和正则表达式。可以处理数字向量。

formatter <- function(x){
  first_part <- ifelse(x < 0 , "0","1")
  second_part <- abs(as.integer(x))
  third_part <- substr(gsub(".+\\.","",as.character(x)),1,6)
  result <- ifelse(!is.na(x),sprintf("%s%03d%s",first_part,second_part,third_part), NA)
  result

}
> formatter(-62.54879632547)
[1] "0062548796"