r语言 - 根据另一列中值的最后 2 位数字创建新列



应该很简单,但它已经成为一个难以解决的问题。我有按尾随小数(上游数据源的乘积(分组的数据。例如,组"3"的数据可以分组为 0.00003,而组"10"的数据为 24.00010。但是,当我同时运行我的regexpr代码和str_sub代码时,好像 R 不认为最后一个 0 很重要。


示例数据

df <- data.frame(a = c(0.00003, 0.00010, 24.00003, 24.00010))
print(df)
a
1  0.00003
2  0.00010
3 24.00003
4 24.00010

期望的输出

a   group
1  0.00003 group03
2  0.00010 group10
3 24.00003 group03
4 24.00010 group10

失败的尝试 1

df %>% mutate(group = paste0("group", regmatches(a, regexpr("(\d{2}$)", a))))         
a   group
1  0.00003 group03
2  0.00010 group01
3 24.00003 group03
4 24.00010 group01

这个失败很奇怪,因为当我检查它时它会起作用:https://regexr.com/,使用(d{2}$)


失败的尝试 2

df %>% mutate(group = paste0("group", str_sub(a, start = -2)))
a   group
1  0.00003 group03
2  0.00010 group01
3 24.00003 group03
4 24.00010 group01

这里的关键是,当您使用正则表达式进行子字符串或提取时,您将数字转换为字符串。但是,该字符串不会保留您期望的格式。

library(tidyverse)
tibble(a = c(0.00003, 0.00010, 24.00003, 24.00010)) %>%
mutate(group1 = paste0("group", str_extract(sprintf("%.5f", a), "\d{2}$")),
group2 = paste0("group", str_extract(a, "\d{2}$")),
sprint_char = sprintf("%.5f", a),
char = as.character(a))
#> # A tibble: 4 x 5
#>          a group1  group2  sprint_char char    
#>      <dbl> <chr>   <chr>   <chr>       <chr>   
#> 1  0.00003 group03 group05 0.00003     3e-05   
#> 2  0.0001  group10 group04 0.00010     1e-04   
#> 3 24.0     group03 group03 24.00003    24.00003
#> 4 24.0     group10 group01 24.00010    24.0001

请参阅此处,as.character(a)不保持与a相同的结构。您可以改为使用sprintf设置格式,然后提取所需的文本。

我们可以转换为character并使用str_sub. 另外,请确保设置了options

options(scipen = 999)
library(stringr)
library(dplyr)
df %>% 
mutate(group = paste0("group", str_sub(sprintf("%2.5f", a), start = -2)))
#        a   group
#1  0.00003 group03
#2  0.00010 group10
#3 24.00003 group03
#4 24.00010 group10
df$group <- sprintf('%s%02.0f', 'group', 1e5*(df$a %% .001))
df
#          a   group
# 1  0.01003 group03
# 2  0.03010 group10
# 3 24.03003 group03
# 4 24.00010 group10

相关内容

最新更新