如何在特定字符上添加值,也用R中的某些数字修复

时间:2017-12-05 01:19:24

标签: r

有基本宽度:xxxx.xxxxxx(&#34之前为4位;。"&#34之后为6位;。")

  1. 必须添加" 0"在"。"之前和之后的每一方。数字不够。
  2. 使用regexr find" [。]"结合str_pad的位置即可 修复前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
    

    我是编码的初学者,有时候不能理解像#34; [" 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")
    
  3. 想知道有没有更好的办法,特别是伯爵和 从END返回位置,直到出现特定字符。

4 个答案:

答案 0 :(得分:3)

使用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
  • format = 'f':格式化双打;
  • width = 11.前的4位数+ . + .后的6位数字;
  • flag = '0':填充前导零;
  • digits = 6:小数点后所需的位数(格式=&#34; f&#34;);

输入df似乎是字符data.frame:

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")

答案 1 :(得分:2)

我们可以使用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 <- structure(list(Category = c(300.03034, 3400.04029, 700.07011, 
1700.0901, 700.070114, 700.0791, 3600.05059, 4400.0402)), 
.Names =   "Category", class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8"))

答案 2 :(得分:1)

有很多很棒的技巧,功能和快捷方式可供学习,我鼓励你们去探索它们!例如,如果您尝试赢取code golf,则需要使用@ 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

答案 3 :(得分:0)

使用separate中的tidyr分隔小数点Category。使用str_pad中的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)