如何在R中将一个整数拆分成其组成数字的向量

6

我认为一个例子可以更好地说明问题。

我有

a_1 = 6547

我想要一个函数,将a_1转换为以下的a_2

a_2 = c(6, 5, 4, 7)


这个问题在SO上已经被回答了几次。自然而然,我找不到它们,但如果你追踪其他问题,你会发现一些,嗯...创造性的解决方案。 - Carl Witthoft
1
找到链接:http://stackoverflow.com/questions/18786432/program-for-armstrong-number-in-r/18786780#18786780 - Carl Witthoft
5个回答

15
将字符串转换为字符,然后进行拆分即可解决问题。
a <- 6547
as.numeric(strsplit(as.character(a), "")[[1]])
## [1] 6 5 4 7

14
(a %% c(1e4, 1e3, 1e2, 1e1)) %/% c(1e3, 1e2, 1e1, 1e0)

在我的电脑上,这比使用strsplit快3-4倍。但是strsplit更加优雅,随着向量长度的增加,差异减小。

library(microbenchmark)
microbenchmark((a %% c(1e4, 1e3, 1e2, 1e1)) %/% c(1e3, 1e2, 1e1, 1e0))
# median of 1.56 seconds
microbenchmark(as.numeric(strsplit(as.character(a), "")[[1]]))
# median of 8.88 seconds

编辑:使用卡尔的洞察力,这里有一个更通用的版本。

a <- 6547
dig <- ceiling(log10(a))
vec1 <- 10^(dig:1)
vec2 <- vec1/10
(a%%vec1)%/%vec2

2
你应该重写代码以处理一般情况,通过计算 log10(a) 并使用(截断或四舍五入的)值来设置您想要除以的最大幂次。我在之前的 SO 回答中编写了该代码,但现在无法找到它了。 - Carl Witthoft
有趣的方法。很有趣看看这是否对非常长的向量更快? - CHP
1
这段代码实际上是错误的,对于10的幂次方(100、1000、10000等)的数字会失败。这可以很容易地解释为ceiling(log10(1000)) == 3,而不是4。我认为可以通过以下方式纠正代码:dig <- floor(log10(a)+1)。它也不能处理0,但我的更改无法修复该问题。 - Arno Kalkman

1
这也可以运行。虽然比其他答案慢,但可能更易于阅读...
library(stringr)
as.integer(unlist(str_split(a, "")))[-1]

0

也许这可以将更快的解决方案集中在一行代码中:

a <- 6547
(a%%(10^(floor(log10(a)+1):1)))%/%((10^(floor(log10(a)+1):1))/10)

[1] 6 5 4 7

0

我认为你应该使用10的幂来完成它。然后递归地,降低这个幂次,将在向量中找到的部分添加并从a_1中删除。 6 x 1000, 5 x 100, 4 x 10, 7 x1 ......


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接