gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:51:22 25 4
gpt4 key购买 nike

应该很简单,但它变成了一个很难解决的问题。我有按尾随小数分组的数据(上游数据源的产物)。例如,组“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 设置格式,然后提取所需的文本。

关于r - 根据另一列中值的最后 2 位数字创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60195494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com