2012-04-18 9 views
6

मैं पाठ की सूची पर अपने पैटर्न (संदर्भ संख्या) की घटनाओं को वापस करने के लिए आर में gsub फ़ंक्शन का उपयोग कर रहा हूं। जब तक कोई मिलान नहीं मिलता है, यह तब तक बढ़िया काम करता है, जिस स्थिति में मुझे खाली स्ट्रिंग के बजाय पूरी स्ट्रिंग वापस मिलती है। उदाहरण पर विचार करें:gsub कोई खाली स्ट्रिंग नहीं लौटाता है जब कोई मिलान नहीं मिलता

data <- list("a sentence with citation (Ref. 12)", 
      "another sentence without reference") 

sapply(data, function(x) gsub(".*(Ref. (\\d+)).*", "\\1", x)) 

रिटर्न:

[1] "Ref. 12"       "another sentence without reference" 

लेकिन मैं पाने के लिए

[1] "Ref. 12"       "" 

धन्यवाद चाहते हैं!

+1

'gsub' नहीं (वर्तमान में, 2.15.0) इस वजह से कर सकते हैं:" "replacement' backreferences जो' परिणाम pattern' में परिभाषित नहीं कर रहे हैं अपरिभाषित है (लेकिन सबसे अधिक बार backreference 'होने के लिए लिया जाता है मौजूद होता है तो' " ')।" –

उत्तर

6

मैं शायद एक अलग मार्ग जाना चाहते हैं, के बाद से sapply मुझे करने के लिए आवश्यक प्रतीत नहीं होता है के रूप में इन कार्यों को पहले से ही vectorized रहे हैं:

fun <- function(x){ 
    ind <- grep(".*(Ref. (\\d+)).*",x,value = FALSE) 
    x <- gsub(".*(Ref. (\\d+)).*", "\\1", x) 
    x[-ind] <- "" 
    x 
} 

fun(data) 
+0

'grep' और 'grepl' का उपयोग करने का कोई कारण नहीं है? –

+0

@ डेविड मुझे ऐसा नहीं लगता है, यह वही है जो मेरी उंगलियों को पहले टाइप करने के लिए हुआ था। – joran

0

आप उस फ़ंक्शन में grep(..., value = T) एम्बेड करने का प्रयास कर सकते हैं।

data <- list("a sentence with citation (Ref. 12)", 
     "another sentence without reference") 

unlist(sapply(data, function(x) { 
    x <- gsub(".*(Ref. (\\d+)).*", "\\1", x) 
    grep("Ref\\.", x, value = T) 
    })) 

भारी प्रकार की लेकिन यह काम करता है? यह खाली दूसरे संदर्भ को भी हटा देता है।

+0

मेरे लिए काम करता है। मेरे मामले में मैं असूची छोड़ दूंगा, क्योंकि मैं अभी भी जानना चाहता हूं कि गुम डेटा कहां है। धन्यवाद! – cboettig

+0

@cboettig ध्यान दें कि 'sapply' यहां अधिक है। – joran

+0

@joran धन्यवाद, मैं एक मामला है कि मैं sapply जरूरत लगता है कि क्योंकि सूचियों की एक सूची डेटा, भूल गया मैं इसे यहाँ जरूरत नहीं थी से उदाहरण सरल बनाने गया था। ;-) यह अच्छा है। – cboettig

2

दस्तावेज़ के अनुसार, इस gsub की एक विशेषता यह रिटर्न है इनपुट स्ट्रिंग यदि आपूर्ति किए गए पैटर्न मैचों में कोई मिलान नहीं है तो संपूर्ण स्ट्रिंग लौटाती है।

यहाँ

, मैं फ़ंक्शन का उपयोग grepl दिया स्ट्रिंग में पैटर्न की उपस्थिति/अनुपस्थिति के एक तार्किक वेक्टर वापस जाने के लिए पहले:

ifelse(grepl(".*(Ref. (\\d+)).*", data), 
     gsub(".*(Ref. (\\d+)).*", "\\1", data), 
     "") 

एक समारोह में इस embedding:

mygsub <- function(x){ 
    ans <- ifelse(grepl(".*(Ref. (\\d+)).*", x), 
       gsub(".*(Ref. (\\d+)).*", "\\1", x), 
       "") 
    return(ans) 
} 

mygsub(data) 
1
xs <- sapply(data, function(x) gsub(".*(Ref. (\\d+)).*", "\\1", x)) 
xs[xs==data] <- "" 
xs 
#[1] "Ref. 12" ""  
1

gsubfn पैकेज में strapplyc आज़माएं:

library(gsubfn) 

L <- fn$sapply(unlist(data), ~ strapplyc(x, "Ref. \\d+")) 
unlist(fn$sapply(L, ~ ifelse(length(x), x, ""))) 

जो इस देता है:

a sentence with citation (Ref. 12) another sentence without reference 
         "Ref. 12"         "" 

आप सूची उत्पादन कोई आपत्ति नहीं है, तो आप सिर्फ एल का उपयोग करें और कोड की अंतिम पंक्ति के बारे में भूल सकता है। ध्यान दें कि fn$ उपसर्ग समारोह के सूत्र तर्क अपने कार्य कॉल में तो कोड की पहली पंक्ति के रूप में sapply(unlist(data), function(x) strapplyc(x, "Ref x. \\d+"))fn बिना लिखा जा सकता है के लिए लागू किया जाता है।

+0

मैंने कभी भी 'एफएन $' इस्तेमाल नहीं किया है - आपको यह कहां मिला? –

+0

gsubfn पैकेज में, 'gsubfn' विग्नेट के '? Fn' और सेक्शन 7 देखें। –

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