有基本宽度:xxxx.xxxxxx(&#34之前为4位;。"&#34之后为6位;。")
使用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")
想知道有没有更好的办法,特别是伯爵和 从END返回位置,直到出现特定字符。
答案 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)