2015-03-03 8 views
6

मैं adist का इस्तेमाल किया है अक्षर हैं जो दो तार के बीच भिन्न की संख्या की गणना करने के लिए अलग-अलग:निकालें अक्षर हैं जो दो तार

a <- "Happy day" 
b <- "Tappy Pay" 
adist(a,b) # result 2 

अब मैं उन चरित्र है कि अलग निकालने के लिए चाहते हैं। मेरे उदाहरण में, मैं स्ट्रिंग "Hd" (या "TP" प्राप्त करना चाहता हूं, इससे कोई फर्क नहीं पड़ता)।

मैंने adist, agrep और stringi में देखने की कोशिश की लेकिन कुछ भी नहीं मिला।

+2

मेरा सुझाव है कि आप संपादन को पूर्ववत करें और एक नई ques पूछें tion। इस नए प्रश्न में आपको अपने वास्तविक डेटा के बारे में अधिक जानकारी देना होगा। उदाहरण के लिए, यह बहुत मायने रखता है कि क्या आप जानते हैं कि स्ट्रिंग के अंत में विभिन्न स्ट्रिंग प्रारंभ बनाम है। आपको यह भी बताना होगा कि आपकी समस्या [सबसे आम सामान्य सबस्ट्रिंग समस्या] (http://en.wikipedia.org/wiki/Longest_common_substring_problem) से संबंधित है या नहीं। – Andrie

+1

सहमत, संपादन पूर्ववत करें, सर्वोत्तम उत्तर स्वीकार करें, और एक नया प्रश्न पूछें।सवाल काफी अलग है, और बहुत से लोगों ने पहले से ही बहुत सारे काम किए हैं। – BrodieG

उत्तर

12

आप संचालन के निम्नलिखित अनुक्रम का उपयोग कर सकते हैं:

  • strsplit() का उपयोग कर स्ट्रिंग को विभाजित करें।
  • उपयोग setdiff() एक को कम करने के समारोह में तत्वों
  • लपेटें तुलना करने के लिए

इस प्रयास करें:

Reduce(setdiff, strsplit(c(a, b), split = "")) 
[1] "H" "d" 
+5

यह कोड गोल्फ में खराब हो रहा है, है ना? :) – Spacedman

+0

'do.call (setdiff, strsplit (c (a, b), split =" "))' शायद अधिक कुशल होगा –

+0

'strsplit'' का दूसरा तर्क 'split' है, इसलिए आपको नाम देने की आवश्यकता नहीं है अगर आप कम शॉट्स में उतरना चाहते हैं। – Spacedman

1

जब तक a और b रूप में एक ही लंबाई हम ऐसा कर सकते हैं:

s.a <- strsplit(a, "")[[1]] 
s.b <- strsplit(b, "")[[1]] 
paste(s.a[s.a != s.b], collapse = "") 

देने:

[1] "Hd" 

इस कोड की स्पष्टता के मामले में सीधा लगता है और के लिए बंधे लगता है यहां प्रदान किए गए समाधानों में से सबसे तेज़ हालांकि मुझे लगता है कि मैं f3:

f1 <- function(a, b) 
    paste(setdiff(strsplit(a,"")[[1]],strsplit(b,"")[[1]]), collapse = "") 

f2 <- function(a, b) 
    paste(sapply(setdiff(utf8ToInt(a), utf8ToInt(b)), intToUtf8), collapse = "") 

f3 <- function(a, b) 
    paste(Reduce(setdiff, strsplit(c(a, b), split = "")), collapse = "") 

f4 <- function(a, b) { 
    s.a <- strsplit(a, "")[[1]] 
    s.b <- strsplit(b, "")[[1]] 
    paste(s.a[s.a != s.b], collapse = "") 
} 

a <- "Happy day" 
b <- "Tappy Pay" 

library(rbenchmark) 
benchmark(f1, f2, f3, f4, replications = 10000, order = "relative")[1:4] 

अपने लैपटॉप पर एक ताजा सत्र पर निम्नलिखित दे रही है:

test replications elapsed relative 
3 f3  10000 0.07 1.000 
4 f4  10000 0.07 1.000 
1 f1  10000 0.09 1.286 
2 f2  10000 0.10 1.429 

मैं मान लिया है कि मतभेदों को इसी चरित्र की स्थिति में होना चाहिए। आप स्पष्ट करना चाहते हैं कि क्या यह इरादा है या नहीं।

4

वास्तव में इस पर गर्व नहीं है, लेकिन यह काम करने के लिए लगता है:

sapply(setdiff(utf8ToInt(a), utf8ToInt(b)), intToUtf8) 

परिणाम: पत्र में

[1] "H" "d" 
+4

यह एक अच्छा है। आप शायद 'intToUtf8 (setdiff (utf8ToInt (ए), utf8ToInt (बी) द्वारा इसे सदिश बना सकते हैं)) –

7

स्प्लिट और सेट के रूप में अंतर ले:

> setdiff(strsplit(a,"")[[1]],strsplit(b,"")[[1]]) 
[1] "H" "d" 
2

आप से एक regex चरित्र वर्ग के रूप में चर में से एक और gsub बाहर का उपयोग कर सकते अन्य एक:

gsub(paste0("[",a,"]"),"",b) 
[1] "TP" 
gsub(paste0("[",b,"]"),"",a) 
[1] "Hd" 
+0

क्या यह काम करता है यदि तारों में regexpy है उनमें विशेष वर्ण? – Spacedman

+0

@ स्पेसमैन हां, अच्छी पकड़, विशेष चरित्र वर्ग रेगेक्स, जैसे '^' और '-' के कारण समस्याएं हो सकती हैं। यह हाइफेनेटेड शब्दों के साथ एक विशेष मुद्दा हो सकता है। – James

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