Convert named vector to list in R

Viewed 12271

Suppose I have the following named numeric vector:

a <- 1:8
names(a) <- rep(c('I', 'II'), each = 4)

How can I convert this vector to a list of length 2 (shown below)?

a.list
# $I
# [1] 1 2 3 4
# $II
# [1] 5 6 7 8

Note that as.list(a) is not what I'm looking for. My very unsatisfying (and slow for large vectors) solution is:

names.uniq <- unique(names(a))
a.list <- setNames(vector('list', length(names.uniq)), names.uniq)
for(i in 1:length(names.uniq)) {
  names.i <- names.uniq[i]
  a.i <- a[names(a)==names.i]
  a.list[[names.i]] <- unname(a.i)
}

Thank you in advance for your help, Devin

4 Answers

To handle also unnamed vectors, use then:

vec_to_list <- function(vec) {
  if (is.null(names(vec))) names(vec) <- 1:length(vec)
  split(unname(vec), names(vec))
}
Related