Reputation: 7561
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
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