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

时间:2013-11-04 08:50:01

标签: r vector type-conversion

我认为一个例子应该足够清楚。

我有

  

a_1 = 6547

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

的函数
  

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

5 个答案:

答案 0 :(得分:12)

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

这比我的计算机快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

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

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

答案 1 :(得分:11)

转换为字符然后拆分就可以了解

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

答案 2 :(得分:1)

这也有效。它比其他答案慢,但可能更容易阅读...

library(stringr)
as.integer(unlist(str_split(a, "")))[-1]

答案 3 :(得分:0)

我认为你应该使用10的力来做到这一点。并递归地降级此功能,添加向量中找到的部分并将其删除到a_1。 6 x 1000,5 x 100,4 x 10,7 x1 .....

答案 4 :(得分:0)

也许这在一行中收集了两个更快的解决方案:

a <- 6547
(a%%(10^(floor(log10(a)+1):1)))%/%((10^(floor(log10(a)+1):1))/10)
<块引用>

[1] 6 5 4 7