简体   繁体   中英

Convert list to dataframe in R and add column with names of sub-lists

List l has three strings that are named one, two, and three, respectively. I want to convert l to a dataframe, and I need an additional column with the names in n .

l <- list(c("a", "b"), c("c", "d", "e"), c("e"))
n <- c("one", "two", "three")

I can do it using a loop, but I'm sure there are more efficient ways of doing this.

out <- NULL
for (i in 1:length(n)){
  step <- rep(n[i], length(l[[i]]))
  out <- c(out, step)}

df <- as.data.frame(unlist(l))
df$n <- out
df

#  unlist(l)     n
#1         a   one
#2         b   one
#3         c   two
#4         d   two
#5         e   two
#6         e three

Using base R, you can essentially do it in two lines.

l <- list(c("a", "b"), c("c", "d", "e"), c("e"))
n <- c("one", "two", "three")

#Create an appropriately sized vector of names
nameVector <- unlist(mapply(function(x,y){ rep(y, length(x)) }, l, n))

#Create the result
resultDF <- cbind.data.frame(unlist(l), nameVector)


> resultDF
  unlist(l) nameVector
1         a        one
2         b        one
3         c        two
4         d        two
5         e        two
6         e      three

Another option is to use stack after setting the name for each element of the list to be the vector:

stack(setNames(l, n))

#  values   ind
#1      a   one
#2      b   one
#3      c   two
#4      d   two
#5      e   two
#6      e three

Another similar base R option:

do.call(rbind, Map(f = expand.grid, l = l, n = n, stringsAsFactors = F))
#   l     n
# 1 a   one
# 2 b   one
# 3 c   two
# 4 d   two
# 5 e   two
# 6 e three

Another option is melt from reshape2

library(reshape2)
melt(setNames(l, n))
#  value    L1
#1     a   one
#2     b   one
#3     c   two
#4     d   two
#5     e   two
#6     e three

Or with base R

data.frame(value = unlist(l), key = rep(n, lengths(l)))
#   value   key
#1     a   one
#2     b   one
#3     c   two
#4     d   two
#5     e   two
#6     e three

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM