如何根据特定字符添加值,也可以使用R中的某些数字进行修复
有基本宽度:xxxx.xxxxxx(在“.”之前有4个数字,在“.”之后有6个数字)如何根据特定字符添加值,也可以使用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
不知道如何在固定数字的特定字符后添加值。 (找不到库,可以从指定的位置计算位置) 像这样的数据
> 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
fromstringr
在前面或后面添加零,并将它们粘贴在一起
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")