• R语言
  • 按字符集相同进行分组的问题

考虑两位素数:

<br />
prime <- function(m) {<br />
     p <- rep(T, m)<br />
     for (i in 2:sqrt(m)) if (p[i]) p[seq(i * 2, m, by = i)] <- F<br />
     which(p)<br />
}<br />
a = prime(99)<br />
a =a[a>10]<br />
 a<br />
 [1] 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97<br />


13,31由{1,3}构成;17,71由{1,7}构成;37,73由{3,7}构成;79,97由{7,9}构成。

如果采用拆分位数也可以把它们分辨出来,但要是直接利用集合{1,3},{1,7}等进行分组,效率会高一些,怎么样可以实现这个分组功能。
</p>

比较笨的方法:

<br />
a = prime(99)<br />
a =a[a>10]<br />
fa = function(x) as.integer(unlist(strsplit(as.character(x),NULL)))<br />
d = lapply(1:length(a),function(i) as.integer(paste(sort(fa(a[i])),collapse='')))<br />
d = do.call(rbind,d)<br />
e = data.frame(x =a,y=d)<br />
e = e[order(e[2]),]<br />
nL<-rle(as.character(e$y))$lengths;<br />
e$z = rep(nL,nL)<br />
f = e[e$z>=2,]<br />
    x  y z<br />
2  13 13 2<br />
7  31 13 2<br />
3  17 17 2<br />
16 71 17 2<br />
8  37 37 2<br />
17 73 37 2<br />
18 79 79 2<br />
21 97 79 2<br />
</p>

回复 第2楼 的 itellin:

直接reverse一下数字行吗。比如reverse(123)返回321,

<br />
a = prime(99)<br />
a[nchar(a)==2]->a<br />
reverse = function(x) as.integer(paste(rev(unlist(strsplit(as.character(x),NULL))),collapse=''))<br />
cbind(a,sapply(a, reverse))->tob<br />
tob[tob[,2] %in% tob[,1],]->tob</p>
<p>
</p>