6
votes

extraire la différence ("complément relatif") entre deux cordes de r

Je ne trouve pas un moyen de faire cela ...

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


0 commentaires

3 Réponses :


1
votes

Je ne sais pas s'il existe une fonction mise en œuvre pour cela dans l'un des packages de manipulation de chaîne (je ne l'ai pas rencontré). Ceci est une implémentation qui ( je pense ) fonctionne xxx


6 commentaires

Merci, mais je ne comprends pas pourquoi cela ne fonctionne pas avec ces deux cordes: Raw_string <- "\" Tranquille, 196 Dossiers de Détenus Trouvés dans la rue (sur les a) \ "http: // rue89. Nouvelobs.com/2014/09/02/tranquille-196-Dossier S-DETENUS-TOUGES-RU E-LES-A-254557 VIA @ RUE89 " ET Clean_string <-" Tranquille, 196 Dossiers de Détenus Trouvés Dans la rue (sur Les A) "


Semble fonctionner, il donne "\" \ "http://rue89.nouvelobs.com/2014/09/02/tranquille-196-Dossier S-Detenus-Douans-ru e-les-a -254557 via @ rue89 "


Vous avez raison: j'ai eu une erreur lors de l'application de la fonction sur une colonne de chaînes, le problème doit être dans mon extérieur pour la boucle! Je vérifie à nouveau


Je reçois un résultat étrange lorsque vous utilisez des chaînes brutes et propres, le contenu d'une colonne Data.frame. J'extrise la teneur en cellule avec ce data $ Raw_String [17] . Si je fais cela, je reçois un résultat différent de si j'ignore directement une valeur à mes chaînes. J'ouvre une nouvelle question, merci!


Ok aura un look. À l'aide de la méthode de @ Roland, c'est plus rapide, je pense que si vous devez l'exécuter sur de nombreuses chaînes, vous y basculez-vous.


Je pensais qu'ils étaient les mêmes, c'est pourquoi j'ai accepté votre réponse (cela vient de 2 minutes plus tôt). Merci pour la suggestion



3
votes

Je voudrais utiliser une boucle aussi:

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"


4 commentaires

Semble travailler pour moi. Qu'est-ce que "ne fonctionne pas" signifie exactement?


Je reçois un résultat étrange lorsque vous utilisez des chaînes brutes et propres, le contenu d'une colonne Data.frame. J'extrise la teneur en cellule avec ce data $ Raw_String [17] . Si je fais cela, je reçois un résultat différent de si j'ignore directement une valeur à mes chaînes. J'ouvre une nouvelle question, merci!


Avez-vous vérifié si vos colonnes Data.frame sont de la classe caractère ?


Je viens de faire! Ils sont ... ça aurait été une erreur idiote :)



1
votes

Voici un peu plus concis en utilisant Sub code>, ce qui nécessite de rendre compte des symboles.

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"


0 commentaires