Select first element of nested list

RList

R Problem Overview


Let's say I have a list like this:

x = list(list(1,2), list(3,4), list(5,6))

I would like a list that contains only the first elements of the nested list. I can do this by returning another list like so

x1 = lapply(x, function(l) l[[1]])

Is there shortcut notation for this?

R Solutions


Solution 1 - R

Not much of a shortcut, but you can do this:

lapply(x, `[[`, 1)
# [[1]]
# [1] 1
#
# [[2]]
# [1] 3
#
# [[3]]
# [1] 5

Solution 2 - R

Another possibility uses the nice purrr library:

library(purrr)
map(x, 1)

Solution 3 - R

For your example list you can just do:

unlist(x)[ c(TRUE,FALSE) ]

but that depends on each sublist having exactly 2 elements.

If there are different numbers of elements then you could first do an sapply to calculate the lengths, then compute the corresponding 1st element positions (see cumsum), then select those values from the unlisted list. But by that time the accepted answer is probably much simpler.

If all the sublists have the same length (but could be different from 2) then you could do something like:

do.call( rbind, x)[,1]

or some other cast to a common object. But I doubt that this would be as efficient as the lapply approach.

Solution 4 - R

We can use pluck from rvest which selects 1st element from each nested list

rvest::pluck(x, 1)
#[[1]]
#[1] 1

#[[2]]
#[1] 3

#[[3]]
#[1] 5

Note that this gives different result with pluck from purrr which selects 1st element (x[[1]])

purrr::pluck(x, 1)

#[[1]]
#[1] 1

#[[2]]
#[1] 2

Solution 5 - R

Not exactly a short notation, but this can also be done with a fold:

Reduce(function(a, b) c(a, b[1]), x, init = c()) 

# [[1]]
# [1] 1
# 
# [[2]]
# [1] 3
# 
# [[3]]
# [1] 5

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlexView Question on Stackoverflow
Solution 1 - RA5C1D2H2I1M1N2O1R2T1View Answer on Stackoverflow
Solution 2 - Ruser3603486View Answer on Stackoverflow
Solution 3 - RGreg SnowView Answer on Stackoverflow
Solution 4 - RRonak ShahView Answer on Stackoverflow
Solution 5 - RnevromeView Answer on Stackoverflow