从字符串中提取数字以允许单词变化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从字符串中提取数字以允许单词变化相关的知识,希望对你有一定的参考价值。
我已经在以下位置询问了此版本:
Extracting Numbers Based On the Following Term in a String:
我有一些凌乱的数据,需要从没有真正统一输入的字符串变量中提取量刑长度。我需要一个人在months
和days
变量中被判“监禁”或“监狱”的月份或天数,而忽略字符串中的任何其他数字(例如,社区服务的天数) 。
所以如果我有数据
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)")
代替上面的代码无济于事。
您能提供的任何帮助将不胜感激。试图找出一种编码方法,因此不必强迫我编写成千上万的观察值。
答案
如何使用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]))
另一答案
我们可以使用tidyr::extract
来匹配数字,然后以"m"
或"d"
开头的单词匹配,然后是监狱或监狱。
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"
信息来划分两个不同的列,因此我用"|"
重复了模式。
以上是关于从字符串中提取数字以允许单词变化的主要内容,如果未能解决你的问题,请参考以下文章