有效地将命名列表转换为data.frame

时间:2018-12-20 11:23:54

标签: r list dataframe

我正在寻找一种有效的方法来进行以下转换:

示例输入:

  ob <-list(a = 2,b = 3)
 

预期输出:

 键值
1一2
2 b 3
 

当前(详细)解决方案:

  data.frame(键=名称(ob),值=取消列表(ob,use.names = FALSE))
 

1 个答案:

答案 0 :(得分:6)

尝试stack

stack(ob)
#  values ind
#1      2   a
#2      3   b

您将需要更改名称。使用setNames

setNames(stack(ob), nm = c("value", "key"))

基准

在@Roland的评论中, stack似乎确实更有效率。请不要使用stack,而是出于效率原因使用OP的解决方案。

n <- 1e5
lst <- as.list(seq_len(n))
names(lst) <- paste0("a", seq_len(n))

library(microbenchmark)
benchmark <- microbenchmark(
  snoram = snoram(lst),
  markus = markus(lst), times = 50
)
benchmark
#Unit: milliseconds
#   expr      min       lq     mean   median       uq      max neval
# snoram   2.475258   2.594479   2.739639   2.652843   2.715575   5.92216    50
# markus 114.387692 119.028200 134.745626 137.524606 144.045112 162.11510    50

到目前为止使用的功能

snoram <- function(l) {
  data.frame(key = names(l), value = unlist(l, use.names = FALSE),
             stringsAsFactors = FALSE) # this gives a hugh performance gain
                                       # thanks to @Roland
}

markus <- function(l) {
  setNames(stack(l), nm = c("value", "key"))
}