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