提取r中两个字符串之间的差异("相对补码")

时间:2015-04-17 14:36:01

标签: r string

我找不到办法做到这一点......

raw_string <- "\"+001\", la bonne surprise de M. Jenn M. Ayache http://goo.gl/3EXxy6 via @MYTF1News"

clean_string <- "+001, la bonne surprise de Jenn Ayache"

desired_string <- "\"\"M. M. http://goo.gl/3EXxy6 via @MYTF1News"

我不确定如何调用此转换。我会说&#34;差异&#34; (如在集合论中,反对&#34; union&#34;和#34;交叉&#34;)。一个更好的名字可能是&#34;相对补充&#34; (http://en.wikipedia.org/wiki/Complement_(set_theory)#Relative_complement)。

我想要的字符串只有clean_string中缺少的所有字符,按照良好的顺序,每次出现时都会丢失一次,包括空格,标点符号等等。

我设法做的最好的事情还不够好:

> a <- paste(Reduce(setdiff, strsplit(c(raw_string, clean_string), split = " ")), collapse = " ")
> a
[1] "\"+001\", M. http://goo.gl/3EXxy6 via @MYTF1News"

3 个答案:

答案 0 :(得分:3)

我也会使用循环:

x <- strsplit(raw_string, "")[[1]]
y <- strsplit(clean_string, "")[[1]]

res <- character(length(x))

j <- 1

for(i in seq_along(x)) {
  if (j > length(y)) {
    res[i:length(x)] <- x[i:length(x)]
    break
  }
  if (x[i] != y[j]) {
    res[i] <- x[i]
  } else {
    j <- j + 1
  }
}

paste(res, collapse = "")
#[1] "\"\"M. M.  http://goo.gl/3EXxy6 via @MYTF1News"

请注意与预期结果相比的额外空间。我想你只是错过了它。

如果速度太慢,使用Rcpp应该很容易实现。

答案 1 :(得分:1)

我不知道在其中一个字符串操作包中是否有一个已实现的函数(我没有遇到它)。这是一个(我认为)有效的实现

raw_string <- "\"+001\", la bonne surprise de M. Jenn M. Ayache http://goo.gl/3EXxy6 via @MYTF1News"
clean_string <- "+001, la bonne surprise de Jenn Ayache"
raw <- strsplit(raw_string, "")[[1]]
clean <- strsplit(clean_string, "")[[1]]
dif <- vector("list")
j <- 1
while(length(clean) > 0) {
    i <- match(clean[1], raw)
    if (i > 1) {
        dif[[j]] <- raw[seq_len(i - 1)]
        j <- j + 1
    }
    clean <- clean[-1]
    raw <- raw[-seq_len(i)]
}
dif[[j]] <- raw
paste(unlist(dif), collapse = "")
#[1] "\"\"M. M.  http://goo.gl/3EXxy6 via @MYTF1News"

答案 2 :(得分:1)

以下是使用sub更简洁的方法,需要您考虑符号。

str_relative_complement <- function(raw_string, clean_string){
    words <- strsplit(clean_string, "")[[1]]
    cur_str <- raw_string
    for(i in words){
        cur_str <- sub(ifelse(grepl("[[:punct:]]", i), paste0("\\", i), i), "", cur_str)
    }
    return(cur_str)
}

raw_string <- '\"+001\", la bonne surprise de M. Jenn M. Ayache http://goo.gl/3EXxy6 via @MYTF1News'
clean_string <- "+001, la bonne surprise de Jenn Ayache"

str_relative_complement(raw_string, clean_string)
[1] "\"\"M. M.  http://goo.gl/3EXxy6 via @MYTF1News"