2015-10-18 12 views
5

Gibt es eine bessere Möglichkeit, dies zu erreichen? Ich möchte alle Zeichenfolgen aus diesem Vektor entfernen, die Teilzeichenfolgen anderer Elemente sind.Entfernen Sie Elemente eines Vektors, die Teilzeichenfolgen eines anderen sind

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" 

Dies funktioniert, aber es scheint, wie viel des Guten und ich bin daran interessiert, eine elegantere Art und Weise zu tun, es zu wissen.

+3

'CJ' die viel schneller ist' data.table' für 'expand.grid ' – jenesaisquoi

+0

Ich wollte nur etwas Fleisch darauf legen für jeden, der weiter verfolgt. 'CJ' ist ** viel ** schneller. Ich nahm '12431' Zeilen mit einem Durchschnitt von' 15.69' Wörtern/Zeile für eine Gesamtmenge von '195065' Wörtern und führte sie durch' system.time (dt <- setDT (expand.grid (word1 = words, word2 = words , stringsAsFactors = FALSE))) 'in' Benutzersystem abgelaufen 8.414 3.387 13.854' noch' system.time (dt1 <- CJ (Wörter, Wörter, unique = TRUE)) 'in' Benutzersystem abgelaufen 0.932 0.365 1.320'. Größenordnung Unterschied. –

+0

Super, danke für den Benchmark –

Antwort

6

Suche für jede Komponente des words in words diejenigen halten, die einmal auftreten:

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

geben:

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

Das ist toll - vielen Dank! –

Verwandte Themen