代码之家  ›  专栏  ›  技术社区  ›  Science11

r用0和破折号格式化数字

  •  2
  • Science11  · 技术社区  · 7 年前

       12344
      233345
     7233433
     9343883
     3432837
    

    我试图格式化这些数字,使它们每三个数字后都具有相同的长度和破折号(-)。最终预期结果如下。

      0-012-344
      0-233-345
      7-233-433
      9-343-883
      3-432-837
    

    如果您能以这种方式帮助格式化这些数字,我们将不胜感激。

    5 回复  |  直到 7 年前
        1
  •  5
  •   mt1022    7 年前

    尝试 formatC :

    formatC(x, width = 7, format = "d", flag = "0", big.mark = '-')
    # [1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
    

    使用的数据:

    x <- scan(textConnection('12344
    233345
    7233433
    9343883
    3432837'))
    
        2
  •  3
  •   Remko Duursma    7 年前

    my_format <- function(num){
    x <- sprintf("%07d", num)
    paste0(substr(x, 1,1), "-",
        substr(x, 2,4), "-",
        substr(x, 5,7))
    }
    
    nums <-  c(12344,233345,7233433,9343883,3432837)
    my_format(nums)
    
    # gives
    [1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
    
        3
  •  2
  •   www    7 年前

    我们可以使用 stringr purrr

    # Data
    numbers <- c("12344", "233345", "7233433", "9343883", "3432837")
    
    # Load package
    library(stringr)
    library(purrr)
    
    # A function to add dash line
    trans_num <- function(number){
      part1 <- str_sub(number, start = 1, end = 1)
      part2 <- str_sub(number, start = 2, end = 4)
      part3 <- str_sub(number, start = 5)
      return(paste(part1, part2, part3, sep = "-"))
    }
    
    numbers %>%
      str_pad(width = 7, pad = "0") %>%
      map_chr(trans_num)
    [1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
    
        4
  •  2
  •   akrun    7 年前

    这是一个 base R 带有的选项 sub sprintf

    sub("(.)(.{3})", '\\1-\\2-', sprintf("%07d", x))
    #[1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
    
        5
  •  1
  •   lebelinoz    7 年前

    首先,您需要构建长度为7、前导为零的字符串。我用过 this :

    strReverse <- function(x)
        sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")
    
    v = as.character(read.table(text = "   12344
      233345
     7233433
     9343883
     3432837", header = FALSE)[,1])
    
    v1 = strReverse( substring(paste0(strReverse(v), "0000"), 1, 7))
    

    > v1
    [1] "0012344" "0233345" "7233433" "9343883" "3432837"
    

    现在,添加破折号应该很简单:

    paste0(substring(v1,1,1), "-", substring(v1,2,4), "-", substring(v1,5,7))