8

Rの数字の文字列をどのように逆にすることができますか?

たとえば、6桁の数字が約1000個あるベクトルがあり、それらが回文であるかどうかを知りたいです。正反対の2つ目のセットを作成したいので、対戦を行うことができます。

4

7 に答える 7

14

これは、実際には、数値自体ではなく、パリンドロームであるとテストしている数値の10進数表現です(255は、16進数と2進数の回文ですが、10進数ではありません)。

これは、パターンマッチングを使用してかなり簡単に行うことができます。

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

数字を文字に変換し、個々の文字に分割し(strsplit)、各数字を逆にして(sapplyとrev)、値を一緒に貼り付けて(paste)、数字に戻す(as.numeric)ことができます。しかし、6桁のパレンドロームに興味がある場合は、上記の方が良いと思います。

于 2010-09-21T19:17:22.393 に答える
5

私はそうは思わない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"
于 2010-09-21T19:11:06.673 に答える
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
于 2010-09-21T19:05:32.937 に答える
2

これは、どのベースを選択しても、一般的なケースで機能するはずです。

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))
}
于 2010-09-22T09:52:10.043 に答える
1

反転自体に興味がある場合は、サブをグレッグの正規表現の長いバージョンで使用できます。

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

これは分割/回転/貼り付けよりも高速ですか?

于 2010-09-21T19:46:21.580 に答える