定义
z<- as.character(c("1_xx xx xxx_xxxx_12_sep.xls","2_xx xx xxx_xxxx_15_aug.xls"))
这样
> z
[1] "1_xx xx xxx_xxxx_12_sep.xls" "2_xx xx xxx_xxxx_15_aug.xls"
我想创建一个 w 的向量
> w
[1] "1_12_sep" "2_15_aug"
即,将 z 的每个元素拆分为 _ ,然后将 .xls 从 .xls 中删除后者。
我可以管理拆分部分,但不确定要提供什么功能,例如“
w <- as.character(lapply(strsplit(z,"_"), function(x) ???))
答案 0 :(得分: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"
str_extract
是一些我觉得更容易使用的基本R函数的包装。
编辑以下是正则表达式的简短说明:
\\d+
查找一个或多个数字。它被转义以区别于正常的角色d。\\w*
查找零个或多个字母数字字符(单词)。再次,它逃脱了。\\.
查找小数点。这需要转义,否则小数点表示任何单个字符。理论上,正则表达式应该非常灵活。它应该为您的日期找到单个或双字符。
答案 1 :(得分:7)
您可以使用strsplit
,substr
和lapply
的组合执行此操作:
y <- strsplit(z,"_",fixed=TRUE)
lapply(y,FUN=function(x){paste(x[1],x[4],substr(x[5],1,3),sep="_")})
答案 2 :(得分:6)
对gsub
的一次调用(以及基于@Andrie的回答的一些正则表达式魔法)可以做到这一点。有关我在?regexp
和pattern
(反向引用)参数中使用的内容的详细信息,请参阅replacement
。
gsub("^(\\d+_).*_(\\d+_\\w*).xls", "\\1\\2", z)
# [1] "1_12_sep" "2_15_aug"
答案 3 :(得分:2)
与@ Joran的答案相同的替代方案是:
foo <- function(x) {
o <- paste(x[c(1,4,5)], collapse = "_")
substr(o, 1, nchar(o) - 4)
}
sapply(strsplit(z, "_"), foo)
差异很小 - 我使用的是collapse = "_"
和nchar()
,但除此之外情况类似。
你可以把它写成一行
sapply(strsplit(z, "_"),
function(x) {o <- paste(x[c(1,4,5)],
collapse = "_"); substr(o, 1, nchar(o)-4)})
但是编写要应用的自定义函数更好。