Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
unlist(strsplit(…)能否产生与gsub(…)相同的结果?_R - Fatal编程技术网

unlist(strsplit(…)能否产生与gsub(…)相同的结果?

unlist(strsplit(…)能否产生与gsub(…)相同的结果?,r,R,在我的SO活动中,我发现许多R用户使用strsplit()进行文本操作,即使结果中没有实际的拆分。话虽如此,我的问题是: 取以下字符向量x: > x <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2") 我也可以使用strsplit()来完成。但是,由于strsplit()的算法((在本文底部有说明),每个匹配项前面都有一个“” > unlist(strsplit(x, ".*\\s")) # [1] "" "2" "

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

取以下字符向量
x

> x <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2")
我也可以使用
strsplit()
来完成。但是,由于strsplit()的算法((在本文底部有说明),每个匹配项前面都有一个
“”

> unlist(strsplit(x, ".*\\s"))
# [1] ""  "2" ""  "1" ""  "2" ""  "1" ""  "2"
通过对上述结果调用
nzchar()
,可以轻松删除这些
字符串。当然,我可以用
strsplit()
nzchar()
编写一个函数来完成这一切


>f正如您在
strsplit
的定义中所指出的,得到空字符串的原因是:

如果(非空)字符串开头有匹配项,则 输出的第一个元素是“”

如果您不想在第一端调用
nzchar
,并且仍然使用
strsplit
,则可以插入一个虚拟字符:

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

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

对于这个特定的示例,我将使用
sapply(strsplit(x,“”,[”,2)
regmatches(x,regexpr(“\\d$”,x))
。是否有理由只使用strsplit来提取最后一个元素(即当您没有真正拆分任何内容时?)@Flick先生,我添加了一个句子,希望能澄清一点。我不确定这是否能帮我澄清问题。
strsplit
的目标是将字符串拆分为不同的部分。当您按
*\\s
拆分时,这将匹配所有内容,包括空格。在这之前,您是否获得了所有内容(即空字符串)以及后面的所有内容(最后一位)。它使用的正则表达式与
gsub
非常不同,仅仅因为它们都接受正则表达式并不意味着它们具有相同的行为。如果您对拆分任何内容不感兴趣,最好像我上面所做的那样使用
regexpr
函数,
> f <- function(x, pattern)
  {
      y <- unlist(strsplit(x, pattern))
      y[nzchar(y)]
  }
> f(x, ".*\\s")
# [1] "2" "1" "2" "1" "2"
res <- unlist(strsplit(paste0('#',x),'\\d{4} '))
res[res !="#"]

[1] "2" "1" "2" "1" "2"
sub('\\d{4} ','',x)