gpt4 book ai didi

r - {tidyr} 中的提取函数存在问题

转载 作者:行者123 更新时间:2023-12-02 18:35:57 26 4
gpt4 key购买 nike

我有一个看起来像这样的数据框。我将其命名为“df_raw”。

"HRHHID\t15\tHOUSEHOLD IDENTIFIER\t(Part 1)\t1- 15"
"HRMONTH\t2\tMONTH OF INTERVIEW\t16-17"
"HRYEAR4\t4\tYEAR OF INTERVIEW\t\t18-21"
"HURESPLI\t2\tLINE NUMBER OF THE RESPONDENT\tCURRENT\t22 - 23""FILLER\t2\t\t27 - 28"...

我正在尝试提取末尾的数字范围,例如1-15、16-17、18-21等。我在正则表达式测试器 ( https://regexr.com/63nl1 ) 上准备了我的正则表达式语法,它似乎针对我想要的内容。

正则表达式:\d+(\s?)-(\s?)\d+$

然后我转到 R 并尝试使用 tidyr 中的 extract 函数(这是我第一次使用它),然后收到错误:“错误:regex 应该定义 1 个组;找到了。”

df_raw %>% 
extract(col = value, into = "", regex = "\\d+(\\s?)-(\\s?)\\d+$")

任何人都可以帮助我了解如何对正则表达式进行分组,以便提取功能正常工作吗?

非常感谢,大卫

最佳答案

我们可以通过指定空白来使用trimws来删除所有内容,直到\t

library(dplyr)
library(stringr)
df_raw %>%
mutate(new = str_remove_all(trimws(value, whitespace = ".*\t"), "\\s+"))

-输出

# A tibble: 5 x 2
value new
<chr> <chr>
1 "HRHHID\t15\tHOUSEHOLD IDENTIFIER\t(Part 1)\t1- 15" 1-15
2 "HRMONTH\t2\tMONTH OF INTERVIEW\t16-17" 16-17
3 "HRYEAR4\t4\tYEAR OF INTERVIEW\t\t18-21" 18-21
4 "HURESPLI\t2\tLINE NUMBER OF THE RESPONDENT\tCURRENT\t22 - 23" 22-23
5 "FILLER\t2\t\t27 - 28" 27-28

或者使用extract,OP 帖子中的代码显示多个捕获组,而我们只想提取到单个列中。在这种情况下,只需获取数字 (\\d+),后跟任意空格 (\\s*)、-,然后是任意空格和数字,用 (...) 将其包装为字符串末尾 ($) 的捕获组

library(tidyr)
df_raw %>%
extract(col = value, into = "new", "(\\d+\\s*-\\s*\\d+)$")
# A tibble: 5 x 1
new
<chr>
1 1- 15
2 16-17
3 18-21
4 22 - 23
5 27 - 28

或者仅使用基础R

trimws(df_raw$value, whitespace = ".*\t")
[1] "1- 15" "16-17" "18-21" "22 - 23" "27 - 28"

数据

df_raw <- structure(list(value = c("HRHHID\t15\tHOUSEHOLD IDENTIFIER\t(Part 1)\t1- 15", 
"HRMONTH\t2\tMONTH OF INTERVIEW\t16-17", "HRYEAR4\t4\tYEAR OF INTERVIEW\t\t18-21",
"HURESPLI\t2\tLINE NUMBER OF THE RESPONDENT\tCURRENT\t22 - 23",
"FILLER\t2\t\t27 - 28")), row.names = c(NA, -5L), class = c("tbl_df",
"tbl", "data.frame"))

关于r - {tidyr} 中的提取函数存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68777138/

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