2015-10-18 8 views
5

C'è un modo migliore per raggiungere questo obiettivo? Mi piacerebbe rimuovere tutte le stringhe da questo vettore, che sono sottostringhe di altri elementi.Rimuovere elementi di un vettore che sono sottostringhe di un altro

words = c("please can you", 
    "please can", 
    "can you", 
    "how did you", 
    "did you", 
    "have you") 
> words 
[1] "please can you" "please can"  "can you"  "how did you" "did you"  "have you" 

library(data.table) 
library(stringr) 
dt = setDT(expand.grid(word1 = words, word2 = words, stringsAsFactors = FALSE)) 
dt[, found := str_detect(word1, word2)] 
setdiff(words, dt[found == TRUE & word1 != word2, word2]) 
[1] "please can you" "how did you" "have you" 

Questo funziona, ma sembra eccessivo e mi interessa sapere un modo più elegante di farlo.

+3

'CJ' è la molto più veloce' 'data.table' per expand.grid ' – jenesaisquoi

+0

Volevo solo mettere un po 'di carne su questo per chiunque lo seguisse. 'CJ' è ** molto ** più veloce. Ho preso '12431' linee con una media di' 15.69' parole/linea per un insieme totale di '195065' parole e l'ho eseguito attraverso' system.time (dt <- setDT (expand.grid (word1 = words, word2 = words , stringheAsFactors = FALSE))) 'in' sistema utente trascorso 8.414 3.387 13.854' ancora 'system.time (dt1 <- CJ (words, words, unique = TRUE))' in 'sistema utente trascorso 0.932 0.365 1.320'. differenza di ordine di grandezza. –

+0

Impressionante, grazie per il benchmark –

risposta

6

Cerca per ogni componente di words in words mantenere quelli che si verificano una volta:

words[colSums(sapply(words, grepl, words, fixed = TRUE)) == 1] 

dando:

[1] "please can you" "how did you" "have you" 
+0

Questo è fantastico - Grazie mille! –

Problemi correlati