在R中我想以下面的格式获取文件名的集合,并将数字返回到第二个下划线的右侧(这将始终是一个数字)和第三个下划线右侧的文本字符串(这将是字母和数字的组合)。
我有这种格式的文件名:
HELP_PLEASE_4_ME
我想提取数字4
和文字ME
然后,我想在我的数据框中创建一个新字段,可以存储这两种类型的数据。有什么建议吗?
答案 0 :(得分:1)
以下是使用regexec
和regmatches
来提取模式的选项:
matches <- regmatches(df$a, regexec("^.*?_.*?_([0-9]+)_([[:alnum:]]+)$", df$a))
df[c("match.1", "match.2")] <- t(sapply(matches, `[`, -1)) # first result for each match is full regular expression so need to drop that.
产地:
a match.1 match.2
1 HELP_PLEASE_4_ME 4 ME
2 SOS_WOW_3_Y34OU 3 Y34OU
如果任何行没有预期的结构,这将会中断,但我认为这就是您想要发生的事情(即,警告您的数据不是您认为的那样)。基于strsplit
的方法需要进行额外检查,以确保您的数据符合您的预期。
数据:
df <- data.frame(a=c("HELP_PLEASE_4_ME", "SOS_WOW_3_Y34OU"), stringsAsFactors=F)
答案 1 :(得分:0)
由于您已经知道需要第二个和第三个下划线之后的文本,因此您可以使用strsplit
并获取第三个和第四个结果。
> x <- "HELP_PLEASE_4_ME"
> spl <- unlist(strsplit(x, "_"))[3:4]
> data.frame(string = x, under2 = spl[1], under3 = spl[2])
## string under2 under3
## 1 HELP_PLEASE_4_ME 4 ME
然后对于更长的向量,你可以在这里做最后两行。
## set up some data
> word1 <- c("HELLO", "GOODBYE", "HI", "BYE")
> word2 <- c("ONE", "TWO", "THREE", "FOUR")
> nums <- 20:23
> word3 <- c("ME", "YOU", "THEM", "US")
> XX <-paste0(word1, "_", word2, "_", nums, "_", word3)
> XX
## [1] "HELLO_ONE_20_ME" "GOODBYE_TWO_21_YOU"
## [3] "HI_THREE_22_THEM" "BYE_FOUR_23_US"
## ------------------------------------------------
## process it
> spl <- do.call(rbind, strsplit(XX, "_"))[, 3:4]
> data.frame(cbind(XX, spl))
## XX V2 V3
## 1 HELLO_ONE_20_ME 20 ME
## 2 GOODBYE_TWO_21_YOU 21 YOU
## 3 HI_THREE_22_THEM 22 THEM
## 4 BYE_FOUR_23_US 23 US
答案 2 :(得分:0)
@BrodieG强制性的stringr
版本的答案非常简洁:
df[c("match.1", "match.2")] <-
t(sapply(str_match_all(df$a, "^.*?_.*?_([0-9]+)_([[:alnum:]]+)$"), "[", 2:3))
仅限上下文。你应该接受BrodieG的回答。