我正在尝试从一栏叙述中提取货币价值及其货币。 但是,叙述中的货币格式比较混乱。
我已经尝试过gsub(),但是不知道如何自定义它来处理不同的情况。
输入:
words <- c("sold for USD 8.5 in cash in Nov. 2005",
"bought in Dec. 2012 for approx. $130",
"sold for GBP 11 on 03/03/2010",
"bought for EUR 33 in cash")
预期输出:
value <- c(8.5, 130, 11, 33)
currency <- c("USD", "USD", "GBP", "EUR")
答案 0 :(得分:2)
我建议使用str_extract_all()
包(stringr
的一部分)中的regular expressions和tidyverse
。
第一个问题是您有一个美元符号,它不是显式的货币。如果您想假设美元符号是 USD -并且可能还有其他示例,例如英镑符号等-那么也许第一步,您可以对源代码进行一些清理文本,只需将出现的“ $”替换为“ USD”即可:
words <- c("sold for USD 8.5 in cash in Nov. 2005",
"bought in Dec. 2012 for approx. $130",
"sold for GBP 11 on 03/03/2010",
"bought for EUR 33 in cash")
words <- str_replace_all(words, "\\$", "USD")
然后创建一个有效货币的字符向量,您可以根据需要添加该向量:
currencies <- c("USD", "GBP", "EUR")
然后设置您的正则表达式:
regexCurrency <- paste0("(", paste0(currencies, collapse = "|"), ")")
## [1] "(USD|GBP|EUR)"
以上内容将找到任何有效的货币。
regexAmount <- "[0-9\\.]+"
上面将找到任何数字值,包括可选的小数点。
然后提取所有有效的货币/值对(即忽略不遵循货币的数字值,例如年份“ 2005”)
x <- str_extract_all(words, paste0(regexCurrency, " *", regexAmount))
[[1]]
[1] "USD 8.5"
[[2]]
[1] "USD130"
[[3]]
[1] "GBP 11"
[[4]]
[1] "EUR 33"
然后使用货币和金额正则表达式为值和货币生成单独的向量:
value <- str_extract_all(x, regexAmount) %>% unlist %>% as.numeric
## [1] 8.5 130.0 11.0 33.0
currency <- str_extract_all(, regexCurrency) %>% unlist
## [1] "USD" "USD" "GBP" "EUR"
您可能需要考虑其他情况,例如币种不同或包含逗号的数字值。这些可以通过根据需要修改正则表达式来解决。
答案 1 :(得分:2)
strapply
从字符串pat
(第一个参数)中提取与模式word
的捕获组(即模式的括号部分)的匹配项,并分别输入捕获组函数的自变量(第三个自变量-该函数可以用代号表示,函数的主体在代字号的右侧)。它返回函数的输出。
library(gsubfn)
pat <- "(USD|GBP|EUR|\\$) *([0-9.]+)"
currency <- strapply(words, pat, ~ sub("\\$", "USD", ..1), simplify = TRUE)
value <- strapply(words, pat, ~ as.numeric(..2), simplify = TRUE)
答案 2 :(得分:1)
在 base 中,您可以先使用$
将USD
更改为gsub
。然后使用currency
和values
用regex
提取regexpr
和regmatches
的匹配项。现在,通过此匹配,您可以使用value
再次提取currency
和gsub
。
tt <- gsub("\\$", "USD", words)
tt <- regmatches(tt, regexpr("\\b(USD|GBP|EUR) *[0-9.]+", tt))
(value <- as.numeric(gsub("[^0-9.]", "", tt)))
#[1] 8.5 130.0 11.0 33.0
(currency <- gsub("[0-9. ]", "", tt))
#[1] "USD" "USD" "GBP" "EUR"