使用R通过下划线拆分文件名文本

时间:2014-04-22 19:47:48

标签: r text split filenames

在R中我想以下面的格式获取文件名的集合,并将数字返回到第二个下划线的右侧(这将始终是一个数字)和第三个下划线右侧的文本字符串(这将是字母和数字的组合)。

我有这种格式的文件名:

HELP_PLEASE_4_ME

我想提取数字4和文字ME

然后,我想在我的数据框中创建一个新字段,可以存储这两种类型的数据。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

以下是使用regexecregmatches来提取模式的选项:

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的回答。