R中的反向数字

问题描述 投票:8回答:7

如何在R中反转一串数字?

例如,我有一个约1000个六位数的向量,我想知道它们是否是回文。我想创建第二套完全相反的商品,所以我可以进行一场比赛。

r reverse palindrome
7个回答
14
投票

实际上是您要测试为回文数的数字的十进制表示形式,而不是数字本身(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位数古生物学感兴趣,那么以上方法会更好。


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"


4
投票

编辑:我读错了问题。这是我后代的答案。


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)) }


2
投票
stringi包中有该功能-stri_reverse

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


1
投票
如果您对逆转感兴趣,可以将sub与Greg的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"


0
投票
使用

intToUtf8

进行拆分,然后反转:
© www.soinside.com 2019 - 2024. All rights reserved.