2015-04-17 65 views
6

兩個字符串之間的差異(「相對補」),我無法找到一個方法來做到這一點...提取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" 

回答

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" 
+0

謝謝,但我不明白爲什麼它不會與這兩個字符串工作:'raw_string < - 「\」 Tranquille酒店,196個卷宗德détenustrouvés丹斯德拉魯(LES上一個)\」 HTTP: //rue89.nouvelobs.com/2014/09/02/tranquille-196-dossiers-detenus-trouves-rue-les-a-254557 via @ Rue89「'and'clean_string < - 」Tranquille,196 dossiers dedétenustrouvésdans la rue(on les a)「' –

+0

似乎工作它給了'」\「\」http://rue89.nouvelobs.com/2014/09/02/tranquille-196-dossiers-detenus-trouves-ru e -les-a-254557 via @ Rue89「' – konvas

+0

你是對的:我在將函數應用到字符串列時出錯,問題必須出現在我的for循環中!我再次檢查 –

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實現。

+2

似乎爲我工作。 「不起作用」是什麼意思? – Roland

+0

對不起,我的錯誤,再次檢查... –

+0

當使用原始和乾淨的字符串data.frame列的內容時,我得到一個奇怪的結果。我用這個'data $ raw_string [17]'提取單元格內容。如果我這樣做,我會得到一個不同的結果,如果我直接給我的字符串賦值。我開了一個新問題,謝謝! –

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"