R - List to data.frame using list names

dataframe, r

Solution

Here are three options to consider:

Option 1

Straightforward selecting of every other element and manually creating your `data.frame`.

setNames(
  data.frame(unlist(poor.loci[c(TRUE, FALSE)], use.names = FALSE),
             unlist(poor.loci[c(FALSE, TRUE)], use.names = FALSE)),
  unique(names(poor.loci)))
#    scaf pos
# 1 HE638   8
# 2 HE638   8
# 3 HE638   8

Option 2

Convert your `list` into a "long" `data.frame` and `reshape` it to the form you want. Can also be done with the "reshape2" package using `melt` and `dcast` instead of `stack` and `reshape`.

X <- stack(lapply(poor.loci, as.character))
X$ID <- ave(X$values, X$values, FUN = seq_along)
reshape(X, direction = "wide", idvar="ID", timevar="ind")
#   ID values.scaf values.pos
# 1  1       HE638          8
# 3  2       HE638          8
# 5  3       HE638          8

Option 3

Rearrange your `list` and convert the rearranged `list` to a `data.frame`:

A <- unique(names(poor.loci))
data.frame(
  setNames(
    lapply(A, function(x) unlist(poor.loci[names(poor.loci) %in% x], 
                                 use.names = FALSE)), A))

Problem

So I have this list: ``` structure(list(scaf = structure(1L, .Label = "HE638", class = "factor"), pos = 8L, scaf = structure(1L, .Label = "HE638", class = "factor"), pos = 8L, scaf = structure(1L, .Label = "HE638", class = "factor"), pos = 8L), .Names = c("scaf", "pos", "scaf", "pos", "scaf", "pos")) ``` I want to get a data.frame so that the two columns are `scaf` and `pos` This is as far as I've gotten: ``` do.call(rbind, poor.loci) ``` Desired result: ``` scaf pos HE638 8 HE638 8 HE638 8 ```

Original source