आर

2010-09-21 11 views
6

में रिवर्स अंक आप आर में संख्याओं की एक स्ट्रिंग को कैसे उलट सकते हैं? उदाहरण के लिएआर

, मेरे पास लगभग 1000 छः अंकों की संख्या का वेक्टर है, और मैं जानना चाहता हूं कि वे पालिंड्रोम हैं या नहीं। मैं एक दूसरा सेट बनाना चाहता हूं जो सटीक रिवर्स है, इसलिए मैं एक मैचअप कर सकता था।

+0

यदि पैलिंड्रोम के अलावा कोई डुप्लिकेट नहीं है, तो आप कर सकते हैं कोशिश करें: लंबाई (एक्स) - लंबाई (अद्वितीय (एक्स)) –

+0

आप किस भाषा के साथ काम कर रहे हैं? – EvanGWatkins

उत्तर

12

यह वास्तव में संख्या है कि आप एक विलोमपद, नहीं संख्या ही (255 हेक्स और बाइनरी में एक palendrome है, लेकिन दशमलव में नहीं) होने के लिए परीक्षण कर रहे हैं की decimial प्रतिनिधित्व है।

आप काफी बस पैटर्न मिलान का उपयोग कर ऐसा कर सकते हैं:

> tmp <- c(100001, 123321, 123456) 
> grepl('^([0-9])([0-9])([0-9])\\3\\2\\1$', tmp) 
[1] TRUE TRUE FALSE 
> 

आप चरित्र के लिए संख्या परिवर्तित कर सकते हैं, अलग-अलग पात्रों (strsplit) में विभाजित है, प्रत्येक संख्या (sapply और राजस्व) रिवर्स, तो मान पेस्ट एक साथ वापस (पेस्ट) और वापस संख्याओं (जैसे। संख्यात्मक) में गुप्त। लेकिन मुझे लगता है कि अगर आप 6 अंकों के palendromes में रुचि रखते हैं तो ऊपर बेहतर है।

+1

अच्छा जवाब ग्रेग। मैं यह तय नहीं कर सका कि 'स्ट्रस्प्लिट' या रेगेक्स विधि अधिक सीधी-आगे होगी, लेकिन आपके जैसे, मैं रेगेक्स विधि पसंद करता हूं। यह * अभिव्यक्ति * नियमित अभिव्यक्ति का वर्णन क्यों करने में मदद कर सकता है। –

+0

धन्यवाद - यह अच्छा है - मैंने स्ट्रस्प्लिट की कोशिश की थी, यह बदसूरत – user446667

+0

ग्रुप लाइन में टोपी क्या करती है - भी, डबल बैक स्लैश क्या करते हैं? – user446667

4

संपादित करें: मैंने प्रश्न को गलत तरीके से पढ़ा। यहां पोस्टरिटी के लिए मेरा जवाब है।


आप rev फ़ंक्शन का उपयोग कर सकते हैं:

> 1:10 
[1] 1 2 3 4 5 6 7 8 9 10 
> rev(1:10) 
[1] 10 9 8 7 6 5 4 3 2 1 
+0

क्या आप इसे व्यक्तिगत इंडेक्स पर लागू कर सकते हैं? तो 1 2 3 आदि प्राप्त करें 8 9 01 11 21 31 41 आदि – user446667

+0

जोश का जवाब देखें; 'strsplit' फ़ंक्शन आमतौर पर एक सबस्ट्रिंग को विभाजित करने के लिए उपयोग किया जाता है। – Shane

3

मुझे नहीं लगता कि rev काफी होता है। यह वेक्टर के तत्वों को उलट देता है, जबकि प्रश्न वेक्टर में तत्वों को कैसे उलट सकता है।

> nums <- sapply(1:10,function(i)as.numeric(paste(sample(1:9,6,TRUE),collapse=""))) 
> nums 
[1] 912516 568934 693275 835117 155656 378192 343266 685182 298574 666354 
> sapply(strsplit(as.character(nums),""), function(i) paste(rev(i),collapse="")) 
[1] "615219" "439865" "572396" "711538" "656551" "291873" "662343" "281586" "475892" "453666" 
+1

+1 ओह वाह। करीबी पढ़ने पर अच्छा काम (http://en.wikipedia.org/wiki/Close_reading)! – Shane

1

आप अपने स्वयं के लिए बदलाव में रुचि रखते हैं, तो आप ग्रेग के regexp की एक लंबी संस्करण के साथ उप उपयोग कर सकते हैं:

> x 
[1] 123321 343324 563660 
> sub('^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])','\\6\\5\\4\\3\\2\\1', x) 
[1] "123321" "423343" "066365" 

हालांकि इस विभाजन/राजस्व/पेस्ट से ज़्यादा तेज़ है?

+1

हां, नियमित अभिव्यक्तियां तब विभाजित होती हैं (~ 5-10x) तब विभाजित/rev/paste/as.numeric से। –

1

इस आधार के किसी भी विकल्प के साथ, सामान्य स्थिति में काम करना चाहिए:

is.palindromic <- function(x, base=10) 
{ 
    p <- 0 
    m <- floor(log(x,base)) 
    sig <- -1 
    for (i in m:0) 
     { 
     tp <- floor(x/base^i) 
     a <- i+1 
     b <- m+1-i 
     if(a==b){c<-0}else{c<-a*b;sig<-sig*-1} 
     p <- p + tp*c*sig 
     x <- x - tp*base^i 
     } 
    return(!as.logical(p)) 
} 
1

वहाँ उस के लिए stringi पैकेज में समारोह है - stri_reverse

require(stringi) 
stri_reverse("123456") 
## [1] "654321" 

अब विलोमपद समारोह हो सकता है के रूप में है कि के रूप में सरल :

palindrome <- function(x) stri_reverse(x)==x 
palindrome(c("651156","1234321")) 
## [1] TRUE TRUE 
+1

मुझे लगता है कि यह सबसे अच्छा जवाब है। छोटा और सरल, +1 –