2015-10-18 14 views
5

के सबस्ट्रिंग हैं, क्या इसे प्राप्त करने का कोई बेहतर तरीका है? मैं इस वेक्टर से सभी तारों को हटाना चाहता हूं, जो अन्य तत्वों के सबस्ट्रिंग्स हैं।एक वेक्टर के तत्व निकालें जो अन्य

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" 

यह काम करता है, लेकिन यह ओवरकिल जैसा लगता है और मुझे इसे करने का एक और शानदार तरीका जानने में दिलचस्पी है।

+3

'CJ' बहुत तेजी से' 'expand.grid के लिए data.table' है ' – jenesaisquoi

+0

बस इस पर कुछ मांस डालने के लिए कुछ मांस रखना चाहता था। 'सीजे' ** ** ** तेज है। मैंने '1 9 5065' शब्दों के कुल सेट के लिए '15.631' शब्दों के औसत के साथ '12431' लाइनें लीं और इसे 'system.time (dt <- setDT (expand.grid (word1 = words, word2 = शब्द के माध्यम से चलाया , स्ट्रिंग्सएफ़ैक्टर्स = गलत))) 'यूजर सिस्टम में' 8.414 3.387 13.854' अभी तक 'system.time (डीटी 1 <- सीजे (शब्द, शब्द, अद्वितीय = सही)) '' यूजर सिस्टम में 0.932 0.365 1.320' से गुजर गया। परिमाण अंतर का क्रम। –

+0

बहुत बढ़िया, बेंचमार्क –

उत्तर

6

words में words के प्रत्येक घटक के लिए खोज उन है कि एक बार घटित रखने:

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

दे रही है:

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

के लिए धन्यवाद यह बहुत अच्छा है - बहुत बहुत धन्यवाद! –

संबंधित मुद्दे