如何根据特定字符添加值,也可以使用R中的某些数字进行修复

如何根据特定字符添加值,也可以使用R中的某些数字进行修复,r,R,有基本宽度:xxxx.xxxxxx(在“.”之前有4个数字,在“.”之后有6个数字) 当“.”之前和之后的每一侧都没有足够的数字时,必须添加“0” 将regexr find“[.]”位置与str_pad can组合使用 固定前4位,但 不知道如何在固定数字的特定字符后添加值。 (找不到库,可以从指定的位置计算位置) 像这样的数据 > df Category 1 300.030340 2 3400.040290 3 700.07011 4

有基本宽度:xxxx.xxxxxx(在“.”之前有4个数字,在“.”之后有6个数字)

  • 当“.”之前和之后的每一侧都没有足够的数字时,必须添加“0”
  • 将regexr find“[.]”位置与str_pad can组合使用 固定前4位,但
    不知道如何在固定数字的特定字符后添加值。 (找不到库,可以从指定的位置计算位置

    像这样的数据

    > df
             Category
    1       300.030340
    2      3400.040290
    3        700.07011
    4        1700.0901
    5       700.070114
    6         700.0791
    7       3600.05059
    8        4400.0402
    
    期望数据

    > df
             Category
    1      0300.030340
    2      3400.040290
    3      0700.070110
    4      1700.090100
    5      0700.070114
    6      0700.079100
    7      3600.050590
    8      4400.040200
    
    我是一个编程新手,有时无法理解一些正则表达式,比如“[” e、 t.c.再解释一下,会非常有帮助的

    我还有这样一个组合:

    df$Category<-ifelse(regexpr("[.]",df$Category)==4,
                 paste("0",df1$Category,sep = ""),df$Category)
    
    df$Category<-str_pad(df$Category,11,side = c("right"),pad="0")
    

    df$Category我们可以使用
    sprintf

    df$Category <- sprintf("%011.6f", df$Category)
    df
    #    Category
    #1 0300.030340
    #2 3400.040290
    #3 0700.070110
    #4 1700.090100
    #5 0700.070114
    #6 0700.079100
    #7 3600.050590
    #8 4400.040200
    

    df$Category有很多很棒的技巧、功能和快捷方式需要学习,我鼓励你去探索它们!例如,如果你想赢,你会想使用@akrun的
    sprintf()
    方法。既然你说自己是初学者,那么将问题分解为各个组成部分可能会更有帮助。在我看来,一种透明且易于遵循的方法是利用
    stringr
    包:

    library(stringr)
    
    location_of_dot <- str_locate(df$Category, "\\.")[, 1]
    substring_left_of_dot <- str_sub(df$Category, end = location_of_dot - 1)
    substring_right_of_dot <- str_sub(df$Category, start = location_of_dot + 1)
    
    pad_left <- str_pad(substring_left_of_dot, 4, side = "left", pad = "0")
    pad_right <- str_pad(substring_right_of_dot, 6, side = "right", pad = "0")
    
    result <- paste0(pad_left, ".", pad_right)
    result
    
    库(stringr)
    
    点的位置在
    tidyr
    中使用
    separate
    Category
    分隔为十进制。使用
    stru pad
    from
    stringr
    在前面或后面添加零,并将它们粘贴在一起

    library(tidyr) # to separate columns on decimal
    library(dplyr) # to mutate and pipes
    library(stringr) # to strpad
    input_data <- read.table(text ="        Category
    1       300.030340
    2      3400.040290
    3        700.07011
    4        1700.0901
    5       700.070114
    6         700.0791
    7       3600.05059
    8        4400.0402", header = TRUE, stringsAsFactors = FALSE) %>%
      separate(Category, into = c("col1", "col2")) %>%
      mutate(col1 = str_pad(col1, width = 4, side= "left", pad  ="0"),
             col2 = str_pad(col2, width = 6, side= "right", pad  ="0"),
             Category = paste(col1, col2, sep = ".")) %>%
      select(-col1, -col2)
    
    library(tidyr)#在十进制中分隔列
    库(dplyr)#变异和管道
    图书馆(stringr)#至strpad
    输入数据%
    分离(类别,分为=c(“col1”、“col2”))%>%
    突变(col1=str_pad(col1,width=4,side=“left”,pad=“0”),
    col2=str_pad(col2,宽度=6,side=“right”,pad=“0”),
    类别=粘贴(col1、col2、sep=“.”)%>%
    选择(-col1,-col2)
    
    使用
    formatC

    df$Category <- formatC(as.numeric(df$Category), format = 'f', width = 11, flag = '0', digits = 6)
    # > df
    #      Category
    # 1 0300.030340
    # 2 3400.040290
    # 3 0700.070110
    # 4 1700.090100
    # 5 0700.070114
    # 6 0700.079100
    # 7 3600.050590
    # 8 4400.040200
    

    你能确认这确实有效吗?它对我不起作用(没有前导零),我也不明白为什么。
    sprintf
    在最近的R中有变化吗?谢谢@akrun。关键是你把
    %04.6f
    改成了
    %011.6f
    。所以
    sprintf
    有效+1。谢谢你akrun!但是“格式“%04.6f”无效;将格式%s用于字符对象”一旦预先用作.numeric更改,最后一个“0”"这次消失。@MauritsEvers谢谢你抓住了它。完美。给OP他们需要的,而不一定是他们要求的:)谢谢。它是完美的。我应该定义值的类型来决定要应用的正确函数。数字作为数字方法,字符作为字符方法。非常感谢!这是一个非常容易理解的方法喜欢用excel的方法。谢谢!非常完整的方法和使用简单的方法混在一起。
    df$Category <- formatC(as.numeric(df$Category), format = 'f', width = 11, flag = '0', digits = 6)
    # > df
    #      Category
    # 1 0300.030340
    # 2 3400.040290
    # 3 0700.070110
    # 4 1700.090100
    # 5 0700.070114
    # 6 0700.079100
    # 7 3600.050590
    # 8 4400.040200
    
    structure(list(Category = c("300.030340", "3400.040290", "700.07011", 
    "1700.0901", "700.070114", "700.0791", "3600.05059", "4400.0402"
    )), .Names = "Category", row.names = c(NA, -8L), class = "data.frame")