我希望能够搜索具有以下格式的特定字符串:
"q4-2015"
"q2-2013"
"q3-2011"
从一长串文件名中将它们分解为两个变量: 季度和年度。
例如,一长串名称可以包括:
"aaaaa-ttttt-eeee-q4-2015-file"
"aaaaaa-fffff-3333-q2-2012-file"
,并且代码应循环遍历文件名,然后在第一种情况下抛出特定的变量
year = 2015, quarter = q4
第二种情况:
year = 2012, quarter = q2
等
答案 0 :(得分:3)
我们可以在此处尝试使用sub
quarters <- sapply(input, function(x) {
sub(".*\\b(q\\d+)-\\d{4}\\b.*", "\\1", x)
})
years <- sapply(input, function(x) {
sub(".*\\bq\\d+-(\\d{4})\\b.*", "\\1", x)
})
df <- data.frame(quarters, years)
df
quarters years
q4-2015 q4 2015
q2-2013 q2 2013
q3-2011 q3 2011
答案 1 :(得分:1)
我们可以尝试这种模式
captured_words <- sub(".*\\b(q\\d)-(\\d+)\\b.*", "\\1-\\2", x)
captured_words
#[1] "q4-2015" "q2-2012"
在这里,我们捕获两个术语:
1)q
后跟一个数字,然后是2)其后的数字。
我们可以将它们分开,并使用read.table
read.table(text = paste0(captured_words, collapse = "\n"), sep = "-")
# V1 V2
#1 q4 2015
#2 q2 2012
数据
x <- c("aaaaa-ttttt-eeee-q4-2015-file","aaaaaa-fffff-3333-q2-2012-file")
答案 2 :(得分:0)
1)捕获使用注释末尾可重复显示的测试输入,可以从基数R调用strcapture
:
pat <- "(q\\d)-(\\d{4})"
strcapture(pat, x, list(quarter = "", year = 0))
给予:
quarter year
1 q4 2015
2 q2 2012
另一种选择是使用数字四分之一列。在这种情况下,我们将使用pat <- "(\\d)-(\\d{4})"
和list(quarter = 0, year = 0)
。
2)gsubfn软件包中的read.pattern read.pattern
可以使用相同的模式。
library(gsubfn)
read.pattern(text = x, pattern = pat, col.names = c("quarter", "year"),
as.is = TRUE)
给予:
quarter year
1 q4 2015
2 q2 2012
2a)另一种方法是使用gsubfn的strapply
生成yearqtr
类对象,然后我们可以很容易地提取季度和年份,也可以将其保留为Yearmon对象:
library(gsubfn)
library(zoo)
ym <- do.call("c",
strapply(x, pat, q + y ~ as.yearqtr(paste(y, q, sep = "-"))))
ym
## [1] "2015 Q4" "2012 Q2"
data.frame(quarter = paste0("q", cycle(ym), year = as.integer(ym),
stringsAsFactors = FALSE)
## quarter year
## 1 q4 2015
## 2 q2 2012
# test input
x <- c("aaaaa-ttttt-eeee-q4-2015-file",
"aaaaaa-fffff-3333-q2-2012-file")