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

使用R按下划线拆分文件名文本,r,text,split,filenames,R,Text,Split,Filenames,在R中,我希望以下面的格式收集文件名,并将数字返回到第二个下划线的右侧(这将始终是一个数字),将文本字符串返回到第三个下划线的右侧(这将是字母和数字的组合) 我有以下格式的文件名: HELP_PLEASE_4_ME 我想提取数字4和文本ME 然后我想在我的数据框中创建一个新字段,在这里可以存储这两种类型的数据。有什么建议吗?这里有一个选项,可以使用regexec和regmatches提取模式: matches <- regmatches(df$a, regexec("^.*?_.*?_(

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

我有以下格式的文件名:

HELP_PLEASE_4_ME
我想提取数字
4
和文本
ME


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

这里有一个选项,可以使用
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.
如果任何行没有预期的结构,这将中断,但我认为这是您希望发生的事情(即,提醒您的数据不是您认为的数据)<基于代码>strsplit的方法将需要额外的检查,以确保您的数据是您认为的数据

和数据:

df <- data.frame(a=c("HELP_PLEASE_4_ME", "SOS_WOW_3_Y34OU"), stringsAsFactors=F)

df既然您已经知道需要第二个和第三个下划线后面的文本,那么可以使用
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
>x spl data.frame(string=x,under2=spl[1],under3=spl[2])
##3下2下的字符串
##请帮帮我
然后对于更长的向量,你可以做一些类似于最后两行的事情

## 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
##设置一些数据
>word1 word2 nums word3 XX XX
##[1]“你好,一个我”“再见,两个你”
##[3]“嗨,三个,他们”“再见,四个,我们”
## ------------------------------------------------
##处理它
>spl数据帧(cbind(XX,spl))
##XX V2 V3
##你好,我
##再见两个你
##3嗨,三个,他们
##4再见,4,23,23,我们

的必选
stringr
版本的非常时髦的答案:

df[c("match.1", "match.2")] <- 
  t(sapply(str_match_all(df$a, "^.*?_.*?_([0-9]+)_([[:alnum:]]+)$"), "[", 2:3))
df[c(“match.1”、“match.2”)]尝试strsplit('HELP_PLEASE_4_ME','uu')或等待一些正则表达式专家发布答案。
df[c("match.1", "match.2")] <- 
  t(sapply(str_match_all(df$a, "^.*?_.*?_([0-9]+)_([[:alnum:]]+)$"), "[", 2:3))