Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a named list from two vectors (names, values)

Is there a way to use mapply on two vectors to construct a named list? The first vector would be of type character and contain the names used for the list while the second contains the values.

So far, the only solution I have is:

> dummyList = list()
> addToList <- function(name, value) {
+ dummyList[[name]] <- value
+ }
> mapply(addToList, c("foo", "bar"), as.list(c(1, 2))
$foo
`1`

$bar
`2`

This seems like a rather contrived solution, but I can't figure out how to do it otherwise. The problems I have with it are:

  1. It requires the creation of dummyList even though dummyList is never changed and is an empty list after the call to mapply.

  2. If the numeric vector, c(1, 2), is not converted to a list, then the result of the call to mapply is a named vector of doubles.

To get around problem 2, I can always just call mapply on two vectors and then call as.list on the result, but it seems like there should be a way to directly create a list with the values being in a vector.

like image 545
Jon Claus Avatar asked Jul 24 '13 19:07

Jon Claus


People also ask

How do I create a named list?

The list can be created using list() function in R. Named list is also created with the same function by specifying the names of the elements to access them. Named list can also be created using names() function to specify the names of elements after defining the list.

How do I convert a vector to a list in R?

In order to convert a vector to a list, R provides us with unlist() function that converts the list into a vector in R. The unlist() function dissolves the list structure fed to it as arguments i.e. it converts the multi-dimensional schema into a a single dimensional schema.

What does list () do in R?

The list() function in R is used to create a list of elements of different types. A list can contain numeric, string, or vector elements.


3 Answers

You can use setNames()

setNames(as.list(c(1, 2)), c("foo", "bar"))

(for a list) or

setNames(c(1, 2), c("foo", "bar"))

(for a vector)

like image 93
Ben Bolker Avatar answered Oct 04 '22 07:10

Ben Bolker


What I propose is made in 2 steps, and it's quite straightforward, so maybe it's easier to understand:

test_list <- list(1, 2)
names(test_list) <- c("foo", "bar")

What @ben-bolker proposes works, but just wanted to share an alternative, in case you prefer it.

Happy coding!

like image 27
Unai Sanchez Avatar answered Oct 04 '22 06:10

Unai Sanchez


I share Ben's puzzlement about why you might want to do this, and his recommendation.

Just for curiosity's sake, there is a sort of "hidden" feature in mapply that will allow this:

x <- letters[1:2]
y <- 1:2
mapply(function(x,y) { y }, x, y, SIMPLIFY = FALSE,USE.NAMES = TRUE)
$a
[1] 1

$b
[1] 2

Noting that the documentation for USE.NAMES says:

USE.NAMES logical; use names if the first ... argument has names, or if it is a character vector, use that character vector as the names.

like image 39
joran Avatar answered Oct 04 '22 08:10

joran