आर

2012-05-22 8 views
6

में लूप के बिना एक परिभाषित स्ट्रिंग सूची के साथ गैर-असीसी वर्णों को बदलें, मैं अपने एसीआई समकक्ष द्वारा गैर-असीसी वर्ण (अभी के लिए, केवल स्पेनिश) को प्रतिस्थापित करना चाहता हूं। अगर मेरे पास "ए" है, तो मैं इसे "ए" के साथ बदलना चाहता हूं।आर

मैंने इस फ़ंक्शन को बनाया (ठीक काम करता है), लेकिन मैं एक लूप (सैपली जैसे आंतरिक लूप सहित) का उपयोग नहीं करना चाहता हूं।

latin2ascii<-function(x) { 
if(!is.character(x)) stop ("input must be a character object") 
require(stringr) 
mapL<-c("á","é","í","ó","ú","Á","É","Í","Ó","Ú","ñ","Ñ","ü","Ü") 
mapA<-c("a","e","i","o","u","A","E","I","O","U","n","N","u","U") 
for(y in 1:length(mapL)) { 
    x<-str_replace_all(x,mapL[y],mapA[y]) 
    } 
x 
} 

क्या इसे हल करने का एक शानदार तरीका है?

library(gsubfn) 

# Create a named list, in which: 
# - the names are the strings to be looked up 
# - the values are the replacement strings 
mapL <- c("á","é","í","ó","ú","Á","É","Í","Ó","Ú","ñ","Ñ","ü","Ü") 
mapA <- c("a","e","i","o","u","A","E","I","O","U","n","N","u","U") 

# ll <- setNames(as.list(mapA), mapL) # An alternative to the 2 lines below 
ll <- as.list(mapA) 
names(ll) <- mapL 


# Try it out 
string <- "ÍÓáÚ" 
gsubfn("[áéíóúÁÉÍÓÚñÑüÜ]", ll, string) 
# [1] "IOaU" 

संपादित करें::

जी Grothendieck बताते हैं कि किसी भी मदद, सुझाव या संशोधन एक ही नाम के पैकेज में

उत्तर

7

gsubfn() सराहना की बात की इस तरह के लिए वास्तव में अच्छा है बेस आर के लिए भी एक फ़ंक्शन है:

A <- paste(mapA, collapse="") 
L <- paste(mapL, collapse="") 
chartr(L, A, "ÍÓáÚ") 
# [1] "IOaU" 
+0

धन्यवाद! अच्छी तरह से काम। केवल एक प्रश्न (बस जानने के लिए); क्या आप जानते हैं कि gsubfn फ़ंक्शन किसी भी प्रकार के आंतरिक लूप का उपयोग करता है या नहीं? तेजी से तेज होना चाहिए? –

+0

@ अलवारो - मुझे नहीं लगता कि 'gsubfn()' विशेष रूप से तेज़ है - 'बस' सुविधाजनक और सुरुचिपूर्ण। –

+1

आर के आधार पर 'चार्टर' भी देखें जो कि समस्या के लिए ठीक लगता है, हालांकि वास्तविक समस्या में भिन्नताएं हैं जैसे कि दो वर्ण अनुक्रमों को प्रतिस्थापित करना, फिर 'gsubfn' अभी भी इसे संभाल सकता है लेकिन 'chartr' नहीं। –

2

मुझे जोश द्वारा संस्करण पसंद है, लेकिन मैंने सोचा कि मैं एक जोड़ सकता हूं नोटर 'वेक्टरकृत' समाधान। यह असंतुलित तारों का एक वेक्टर लौटाता है। यह केवल base कार्यों पर निर्भर करता है।

x=c('íÁuÚ','uíÚÁ') 

mapL<-c("á","é","í","ó","ú","Á","É","Í","Ó","Ú","ñ","Ñ","ü","Ü") 
mapA<-c("a","e","i","o","u","A","E","I","O","U","n","N","u","U") 
split=strsplit(x,split='') 
m=lapply(split,match,mapL) 
mapply(function(split,m) paste(ifelse(is.na(m),split,mapA[m]),collapse='') , split, m) 
# "iAuU" "uiUA"