unlist(strsplit(...))可以产生与gsub(...)相同的结果吗?

时间:2014-06-09 17:28:09

标签: r

在我的SO活动中,我发现许多R用户使用strsplit()进行文本操作,即使结果中没有发生实际的拆分。话虽这么说,这是我的问题:

采用以下字符向量x

> x <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2")

我可以使用正则表达式和gsub()

提取每个字符串中的最后一位数字
> gsub(".*\\s", "", x)
# [1] "2" "1" "2" "1" "2"

我也可以用strsplit()来做。但是,由于strsplit()的算法(在本文的底部注明),""位于每场比赛的前面。

> unlist(strsplit(x, ".*\\s"))
# [1] ""  "2" ""  "1" ""  "2" ""  "1" ""  "2"

通过在上面的结果上调用"",可以轻松删除这些nzchar()字符串。当然,我可以使用strsplit()nzchar()编写一个函数来完成所有操作。

> f <- function(x, pattern)
  {
      y <- unlist(strsplit(x, pattern))
      y[nzchar(y)]
  }
> f(x, ".*\\s")
# [1] "2" "1" "2" "1" "2"

由于strsplit()在其split参数中接受正则表达式,我认为可能从unlist(strsplit(...))得到与{fom gsub(...)相同的结果。有没有人知道如何做到这一点,或者它是否可能?

来自?strsplit

注意:

  

应用于每个输入字符串的算法...意味着如果在(非空)字符串的开头存在匹配,则输出的第一个元素是&#34;&#34;,但是如果字符串末尾有一个匹配项,输出与删除的匹配项相同。当前语言环境中的无效输入最多会被警告5次。

1 个答案:

答案 0 :(得分:2)

正如你在strsplit的定义中指出的那样,你得到空字符串的原因是:

  

如果在(非空)字符串的开头有匹配,则   输出的第一个元素是&#34;&#34;

如果您不想在最后致电nzchar,仍然使用strsplit,则可以插入虚拟角色:

res <- unlist(strsplit(paste0('#',x),'\\d{4} '))
res[res !="#"]

[1] "2" "1" "2" "1" "2"

但我认为最好使用sub替换不需要的字符(不是gsub):

sub('\\d{4} ','',x)