如何在R中反转一串数字?
例如,我有一个约1000个六位数的向量,我想知道它们是否是回文。我想创建第二套完全相反的商品,所以我可以进行一场比赛。
实际上是您要测试为回文数的数字的十进制表示形式,而不是数字本身(255是十六进制和二进制的古生物,但不是十进制)。>>
您可以使用模式匹配相当简单地做到这一点:
> tmp <- c(100001, 123321, 123456)
> grepl( '^([0-9])([0-9])([0-9])\\3\\2\\1$', tmp )
[1] TRUE TRUE FALSE
>
您可以将数字转换为字符,分割为单个字符(strsplit),反转每个数字(sapply和rev),然后将值粘贴回(粘贴)并隐式恢复为数字(as.numeric)。但是我认为,如果您只对6位数古生物学感兴趣,那么以上方法会更好。
我认为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"
编辑:我读错了问题。这是我后代的答案。
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))
}
stringi
包中有该功能-stri_reverse
require(stringi)
stri_reverse("123456")
## [1] "654321"
> 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"
intToUtf8
进行拆分,然后反转: