拆分字符串向量并将结果元素的子集粘贴到新向量中

Fre*_*red 11 string split r vector

限定

z<- as.character(c("1_xx xx xxx_xxxx_12_sep.xls","2_xx xx xxx_xxxx_15_aug.xls"))
Run Code Online (Sandbox Code Playgroud)

这样的

> z
[1] "1_xx xx xxx_xxxx_12_sep.xls" "2_xx xx xxx_xxxx_15_aug.xls"
Run Code Online (Sandbox Code Playgroud)

我想创建一个向量w ^这样

> w
[1] "1_12_sep" "2_15_aug"
Run Code Online (Sandbox Code Playgroud)

也就是说,用_分割z的每个元素然后连接元素1,4,5,从后者中删除.xls.

我可以管理拆分部分,但不确定要提供什么功能,例如"

w <- as.character(lapply(strsplit(z,"_"), function(x) ???))
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 8

为此,您可以使用的组合strsplit,substr并且lapply:

y <- strsplit(z,"_",fixed=TRUE)
lapply(y,FUN=function(x){paste(x[1],x[4],substr(x[5],1,3),sep="_")})
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!我尝试了它,它的工作原理.但我使用`w < - as.vector(sapply(y,FUN = function(x){paste(x [1],x [4],substr(x [5],1,3),sep ="_ ")}))`获取向量而不是列表列表. (2认同)

And*_*rie 8

stringr包中使用一些魔法:我分别提取左右日期字段,合并它们,最后删除.xls最后一个.

library(stringr)
l <- str_extract(z, "\\d+_")
r <- str_extract(z, "\\d+_\\w*\\.xls")
gsub(".xls", "", paste(l, r, sep=""))

[1] "1_12_sep" "2_15_aug"
Run Code Online (Sandbox Code Playgroud)

str_extract 是一些我觉得更容易使用的基本R函数的包装器.

编辑这里是正则表达式的简短解释:

  • \\d+查找一个或多个数字.逃脱以区别于正常角色d.
  • \\w*查找零个或多个字母数字字符(单词).它再一次逃脱了.
  • \\.寻找小数点.这需要转义,否则小数点表示任何单个字符.

从理论上讲,正则表达式应该非常灵活.它应该为您的日期找到单个或双字符.


Jos*_*ich 6

一次调用gsub(以及基于@Andrie的答案的一些正则表达式魔法)可以做到这一点.有关?regexp我在patternreplacement(反向引用)参数中使用的内容的详细信息,请参阅.

gsub("^(\\d+_).*_(\\d+_\\w*).xls", "\\1\\2", z)
# [1] "1_12_sep" "2_15_aug"
Run Code Online (Sandbox Code Playgroud)