Обратные цифры в R - PullRequest
       36

Обратные цифры в R

6 голосов
/ 21 сентября 2010

Как вы можете перевернуть строку чисел в R?

например, у меня есть вектор из примерно 1000 шестизначных чисел, и я хотел бы знать, являются ли они палиндромами. Я хотел бы создать второй набор, который является точным обратным, чтобы я мог сделать сопоставление.

Ответы [ 6 ]

12 голосов
/ 21 сентября 2010

На самом деле это десятичное представление числа, которое вы проверяете на палиндром, а не само число (255 - это шестнадцатеричный и двоичный календари, но не десятичные).

Вы можете сделать этодовольно просто, используя сопоставление с образцом:

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

вы можете преобразовать числа в символы, разделить на отдельные символы (strsplit), обратить каждое число (sapply и rev), затем вставить значения обратно вместе (вставить) ивернуться к номерам (как числовые).Но я думаю, что вышесказанное будет лучше, если вы просто заинтересованы в 6-значных календарях.

4 голосов
/ 21 сентября 2010

Я не думаю, что 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"
4 голосов
/ 21 сентября 2010

Редактировать: Я неправильно понял вопрос.Вот мой ответ для потомков.


Вы можете использовать функцию 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
1 голос
/ 11 апреля 2014

Для этого в пакете 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 голос
/ 22 сентября 2010

Это должно работать в общем случае, с любым выбором базы:

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 голос
/ 21 сентября 2010

Если вы заинтересованы в разворотах для себя, вы можете использовать sub с более длинной версией регулярного выражения Грега:

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

Хотя это быстрее, чем split / rev / paste?

...