我们如何将整数分成R中其组成数字的向量

Rem*_*i.b 3 r vector type-conversion

我认为一个例子应该让事情变得清晰.

我有

a_1 = 6547

我想要一些将a_1变换为以下a_2的函数

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

Ani*_*ban 13

(a %% c(1e4, 1e3, 1e2, 1e1)) %/% c(1e3, 1e2, 1e1, 1e0)
Run Code Online (Sandbox Code Playgroud)

这比我的计算机快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
Run Code Online (Sandbox Code Playgroud)

编辑:使用Carl的见解,这是一个更通用的版本.

a <- 6547
dig <- ceiling(log10(a))
vec1 <- 10^(dig:1)
vec2 <- vec1/10
(a%%vec1)%/%vec2
Run Code Online (Sandbox Code Playgroud)

  • 您应该通过计算log10(a)并使用(截断的或四舍五入的)值设置希望除以的最大幂来重写以处理一般情况。我在先前关于SO的一些答案中为此编写了代码,但暂时无法对其进行跟踪。 (2认同)

Chi*_*til 12

转换为字符然后拆分将成功

a <- 6547
as.numeric(strsplit(as.character(a), "")[[1]])
## [1] 6 5 4 7
Run Code Online (Sandbox Code Playgroud)