【问题标题】:Convert named list to a data.frame efficiently [duplicate]有效地将命名列表转换为data.frame [重复]
【发布时间】:2018-12-20 11:23:54
【问题描述】:

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

示例输入:

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

预期输出:

  key value
1   a     2
2   b     3

当前(详细)解决方案:

data.frame(key = names(ob), value = unlist(ob, use.names = FALSE))

【问题讨论】:

  • 我希望您的解决方案比 markus 提出的方法更有效。

标签: r list dataframe


【解决方案1】:

试试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"))
}

【讨论】:

  • snoram 中设置stringsAsFactors = FALSE 比你的方法快一到两个数量级。
  • @Roland 感谢您的评论! OP 的解决方案速度快了很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2020-05-22
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多