6

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

我有

a_1 = 6547

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

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

4

5 回答 5

15

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

a <- 6547
as.numeric(strsplit(as.character(a), "")[[1]])
## [1] 6 5 4 7
于 2013-11-04T08:59:30.927 回答
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
于 2013-11-04T10:32:24.377 回答
1

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

library(stringr)
as.integer(unlist(str_split(a, "")))[-1]
于 2013-11-04T18:57:47.930 回答
0

我认为你应该使用 10 的幂来做到这一点。并且递归地,降级这个幂,添加向量中找到的部分并将其删除到 a_1。6×1000、5×100、4×10、7×1……

于 2013-11-04T08:59:41.663 回答
0

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

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

[1] 6 5 4 7

于 2021-07-02T14:32:04.663 回答