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
,然后提取所需的文本。
推荐阅读
- regex - Sed 只识别部分搜索模式
- javascript - Select2:如何选择相关结果
- rest - 正确的 Restful API 设计指南
- bash - 如何在 bash 中的两个循环之间创建一对一的关系?
- phaser-framework - 如何调整玩家的物理界限?
- javascript - 我可以使用 val() 插入或编辑文件输入吗?
- mysql - 如何用 MySQL 查询替换列值
- keras - 如何创建基于批次而不是时期更新的 Keras 学习率计划
- linux - 如何在不以“特定字符”结尾的bash中显示所有用户
- ios - iOS应用提示保存密码时,如何检测用户是否选择了Not Now?