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

时间:2011-06-17 21:21:15

标签: r string vector split

定义

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) ???))

4 个答案:

答案 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)

您可以使用strsplitsubstrlapply的组合执行此操作:

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的回答的一些正则表达式魔法)可以做到这一点。有关我在?regexppattern(反向引用)参数中使用的内容的详细信息,请参阅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)})

但是编写要应用的自定义函数更好。