I have a list of the form:
dat[[1]], dat[[2]], ..., dat[[n]]
and I would like to obtain instead two separate lists, one containing dat with odd indices and the other one with even indices, i.e.:
new_dat_odd <- dat[[1]], dat[[3]], dat[[5]], ...
new_dat_even <- dat[[2]], dat[[4]], dat[[6]], ...
In trying to do this, my main issue is I can't find how to refer to the indices of a list in R.
Thank you for any suggestions.
1) If L
is the list then we can use this code where we note that 1:2
is recycled as needed:
s <- split(L, 1:2)
1a) The above works whether the list is even or odd length but as per the comment if odd it gives a warning. The followingi modification gives the same answer but gives no warning:
s <- split(L, rep(1:2, length = length(L)))
In either of the above s[[1]]
and s[[2]]
are the two lists. For example,
> L <- as.list(1:10)
> str(split(L, 1:2))
List of 2
$ 1:List of 5
..$ : int 1
..$ : int 3
..$ : int 5
..$ : int 7
..$ : int 9
$ 2:List of 5
..$ : int 2
..$ : int 4
..$ : int 6
..$ : int 8
..$ : int 10
2) Here is another way:
is.odd <- rep(c(TRUE, FALSE), length = length(L))
list(odd = L[is.odd], even = L[!is.odd])
Update Added 1a and 2.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With