2010-09-21 20 views
6

¿Cómo se puede invertir una cadena de números en R?Dígitos inversos en R

por ejemplo, tengo un vector de aproximadamente 1000 números de seis dígitos, y me gustaría saber si son palíndromos. Me gustaría crear un segundo set que sea el reverso exacto, así que podría hacer un emparejamiento.

+0

Si no hay más duplicados que los palíndromos, podría try: length (x) - length (unique (x)) –

+0

¿con qué idioma estás trabajando? – EvanGWatkins

Respuesta

12

En realidad, es la representación decimial del número que se está probando ser un palíndromo, no el propio número (255 es un palendrome en hexadecimal y binario, pero no decimales).

Usted puede hacer esto de manera bastante simple uso de la coincidencia de modelos:

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

podría convertir los números a carácter, dividido en caracteres individuales (strsplit), invierta cada número (sapply y rev), a continuación, pegar los valores volver a juntar (pegar) y volver a los números (como.numérico). Pero creo que lo anterior es mejor si solo estás interesado en los palendromes de 6 dígitos.

+1

Buena respuesta Greg. No pude decidir si el método 'strsplit' o regex sería más directo, pero, como tú, prefiero el método de expresión regular. Puede ser útil explicar * por qué * la expresión regular funciona. –

+0

gracias - esto es lindo - Probé el strsplit, era feo – user446667

+0

¿Qué hace el sombrero en la línea grepl, también, qué hacen las barras diagonales dobles? – user446667

4

Editar: He leído mal la pregunta. Aquí está mi respuesta para la posteridad.


Puede utilizar la función 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

¿Puedes aplicar eso a índices individuales? así que obtenga 1 2 3 etc. 8 9 01 11 21 31 41 etc. – user446667

+0

Vea la respuesta de Josh; la función 'strsplit' se usa generalmente para dividir una subcadena. – Shane

3

No creo rev bastante lo hace. Revierte los elementos del vector, mientras que la pregunta es cómo invertir los elementos en el vector.

> 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 Oh guau. Buen trabajo en lectura cercana (http://en.wikipedia.org/wiki/Close_reading)! – Shane

1

Si usted está interesado en las reversiones por su propio bien, puede utilizar sub con una versión más larga de expresión regular de Greg:

> 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" 

Aunque es más rápido que este split/rev/pegar?

+1

Sí, las expresiones regulares son más rápidas (~ 5-10x) que las de split/rev/paste/as.numeric. –

1

Esto debería funcionar en el caso general, con cualquier opción de la base:

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

hay función en stringi paquete para que - stri_reverse

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

función Ahora palíndromo podría tan simple como eso :

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

Creo que esta es la mejor respuesta. Corto y simple, +1 –

Cuestiones relacionadas