Learn R Programming

purrr (version 0.3.4)

transpose: Transpose a list.

Description

Transpose turns a list-of-lists "inside-out"; it turns a pair of lists into a list of pairs, or a list of pairs into pair of lists. For example, if you had a list of length n where each component had values a and b, transpose() would make a list with elements a and b that contained lists of length n. It's called transpose because x[[1]][[2]] is equivalent to transpose(x)[[2]][[1]].

Usage

transpose(.l, .names = NULL)

Value

A list with indexing transposed compared to .l.

Arguments

.l

A list of vectors to transpose. The first element is used as the template; you'll get a warning if a subsequent element has a different length.

.names

For efficiency, transpose() bases the return structure on the first component of .l by default. Specify .names to override this.

Details

Note that transpose() is its own inverse, much like the transpose operation on a matrix. You can get back the original input by transposing it twice.

Examples

Run this code
x <- rerun(5, x = runif(1), y = runif(5))
x %>% str()
x %>% transpose() %>% str()
# Back to where we started
x %>% transpose() %>% transpose() %>% str()

# transpose() is useful in conjunction with safely() & quietly()
x <- list("a", 1, 2)
y <- x %>% map(safely(log))
y %>% str()
y %>% transpose() %>% str()

# Use simplify_all() to reduce to atomic vectors where possible
x <- list(list(a = 1, b = 2), list(a = 3, b = 4), list(a = 5, b = 6))
x %>% transpose()
x %>% transpose() %>% simplify_all()

# Provide explicit component names to prevent loss of those that don't
# appear in first component
ll <- list(
  list(x = 1, y = "one"),
  list(z = "deux", x = 2)
)
ll %>% transpose()
nms <- ll %>% map(names) %>% reduce(union)
ll %>% transpose(.names = nms)

Run the code above in your browser using DataLab