Remi.b
Remi.b

Reputation: 18219

How can we split an integer number into a vector of its constituent digits in R

I think an example should make things clear enough.

I have

a_1 = 6547

and I want some function that transform a_1 into the following a_2

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

Upvotes: 6

Views: 17433

Answers (5)

Vitor Hugo Moreau
Vitor Hugo Moreau

Reputation: 75

Maybe this gather both the faster solutions in a single line:

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

[1] 6 5 4 7

Upvotes: 0

Anirban
Anirban

Reputation: 271

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

This is 3-4x as fast on my computer than doing a strsplit. But the strsplit is a lot more elegant and the difference decreases with longer vectors.

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

Edit: using Carl's insight, here is a more general version.

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

Upvotes: 14

dardisco
dardisco

Reputation: 5274

This also works. It's slower than the other answers, but possibly easier to read...

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

Upvotes: 1

Mayhem50
Mayhem50

Reputation: 305

I think you should use power of 10 to do it. And recursivly, downgrade this power , add the part found in vector and remove this to a_1. 6 x 1000, 5 x 100, 4 x 10, 7 x1 .....

Upvotes: 0

CHP
CHP

Reputation: 17189

Convert to character then split will do the trick

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

Upvotes: 15

Related Questions