提取r中
两个字符串之间的差异(“相对补”),我无法找到一个方法来做到这一点...提取r中
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"
我不知道如何把这种转变。我会说“差异”(如在集合论中,反对“工会”和“交集”)。更好的名字可以是“相对补充”(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"
我不知道是否有这个一个实施的功能的字符串操作包之一(我还没有碰到来它)。这是一个实现(我认为)的作品
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"
我会用一个循环,太:
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实现。
似乎为我工作。 “不起作用”是什么意思? – Roland
对不起,我的错误,再次检查... –
当使用原始和干净的字符串data.frame列的内容时,我得到一个奇怪的结果。我用这个'data $ raw_string [17]'提取单元格内容。如果我这样做,我会得到一个不同的结果,如果我直接给我的字符串赋值。我开了一个新问题,谢谢! –
下面是使用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"
谢谢,但我不明白为什么它不会与这两个字符串工作:'raw_string
似乎工作它给了'”\“\”http://rue89.nouvelobs.com/2014/09/02/tranquille-196-dossiers-detenus-trouves-ru e -les-a-254557 via @ Rue89“' – konvas
你是对的:我在将函数应用到字符串列时出错,问题必须出现在我的for循环中!我再次检查 –