从包含单词变化的字符串中提取数字

3
我已经在以下链接中提出了类似的问题:从字符串中提取基于特定术语的数字

我有一些混乱的数据需要从字符串变量中提取判刑期限,但输入不规范。 我需要将一个人被判入‘监狱’或‘拘留所’的月数或天数提取到月份天数变量中,同时忽略字符串中的其他任何数字(例如社区服务的天数)。

因此,如果我的数据如下:

library(data.table)
data<-data.table(text=c("Person 1: $1000 fine, 31 months jail", 
                        "Person 2: $500 fine, 45 days jail",
                        "Person 3: 35 dys jail",
                        "Person 4: 14 mnths prison, 30 days community release"))
data


                                                   text
1:                 Person 1: $1000 fine, 31 months jail
2:                    Person 2: $500 fine, 45 days jail
3:                                Person 3: 35 dys jail
4: Person 4: 14 mnths prison, 30 days community release

我需要推断出月和日的信息,以形成:
library(data.table)
data<-data.table(text=c("Person 1: $1000 fine, 31 months jail", 
                        "Person 2: $500 fine, 45 days jail",
                        "Person 3: 35 dys jail",
                        "Person 4: 14 mnths prison, 30 days community release"), 
                 months=c("31","","","14"), 
                 days=c("","45","35",""))
data

                                                   text months days
1:                 Person 1: $1000 fine, 31 months jail     31     
2:                    Person 2: $500 fine, 45 days jail          45
3:                                Person 3: 35 dys jail          35
4: Person 4: 14 mnths prison, 30 days community release     14   

我一直在尝试使用 library(qdap) 并调整以下代码,以解决我之前提出的问题:

library(dplyr)
data <- dplyr::mutate(data,
                      months = stringr::str_extract(text, "\\d+(?=\\s*months*)"),
                      days = stringr::str_extract(text, "\\d+(?=\\s*days*)"))

然而,我所做的一切都没有起作用。不可否认,文本分析是我的弱点,我很快意识到用类似于str_extract(text, "\\d+(?=\\s*days|dys* jail|prison)")替换上述代码没有任何效果。

如果您能提供任何帮助,将不胜感激。我正在试图想出一种编码方式,以便不被迫手动编写数千个观察结果。

2个回答

3
如何使用stringr::str_match并仅匹配星期几或月份的首字母...
data <- mutate(data,
               months = as.numeric(str_match(text, "(\\d+)\\s*m")[,2]),                   
               days = as.numeric(str_match(text, "(\\d+)\\s*d")[,2]))

3
我们可以使用 tidyr::extract 函数匹配数字,其后跟以 "m""d" 开头的单词,并且后面跟着单词 jailprison
tidyr::extract(data, text, into = c("months", "days"), 
   regex = ".*?(\\d+)\\sm.*\\s(?=jail|prison)|.*?(\\d+)\\sd.*\\s(?=jail|prison)", 
   remove = FALSE, convert = TRUE)

#                                                   text months days
#1:                 Person 1: $1000 fine, 31 months jail     31   NA
#2:                    Person 2: $500 fine, 45 days jail     NA   45
#3:                                Person 3: 35 dys jail     NA   35
#4: Person 4: 14 mnths prison, 30 days community release     14   NA

我们也可以将模式组合在一起并使其更短,但由于我们想要两列不同的信息 "month""days",我已经使用了带有 "|" 的重复模式。


如@thelatemail所建议的基本R版本,可以使用 strcapture 实现:

strcapture(".*?(\\d+)\\sm.*\\s(?=jail|prison)|.*?(\\d+)\\sd.*\\s(?=jail|prison)", 
            data$text, proto=list(months=1L,days=1L), perl=TRUE)

不错。基于R的strcapture函数翻译 - strcapture(pattern = regex, data$text, proto=list(months=1L,days=1L), perl=TRUE) - thelatemail
这个可行!我无法感谢你的足够,我一直在面对着非常乏味的逐行手动编码。救星。 - CSk9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接