Wojciech Sobala
Wojciech Sobala

Reputation: 7561

Split vector with letters and numbers at the letters, into a list

I have a character vector with letters and numbers:

c("A", "1", "2", "3",   "B", "4", "5",   "D", "6", "7", "8", "9", "10")

I would like to transform this vector into list. The names of the list elements are the letters in the vector. The values in each list element are the numbers in the vector, which come in blocks between letters:

list(A = c(1, 2, 3), B = c(4, 5), ...)

Upvotes: 14

Views: 1085

Answers (1)

Joshua Ulrich
Joshua Ulrich

Reputation: 176648

Here's one way. Nothing fancy, but it gets the job done.

x <- c("A","1","2","3","B","4","5","D","6","7","8","9","10")
y <- cumsum( grepl("[[:alpha:]]", x) )
z <- list()
for(i in unique(y)) z[[x[y==i][1]]] <- as.numeric(x[y==i][-1])
z
# $A
# [1] 1 2 3
#
# $B
# [1] 4 5
#
# $D
# [1]  6  7  8  9 10

# UPDATE: Trying to be a bit more "fancy"
a <- grepl("[[:alpha:]]", x)
b <- factor(cumsum(a), labels=x[a])
c <- lapply(split(x,b), function(x) as.numeric(x[-1]))

Upvotes: 23

Related Questions