这个问题在这里已经有了答案:
Named List To/From Data.Frame
(4 个回答)
2年前关闭。
我正在寻找一种有效的方式进行以下转换:
示例输入:
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))
最佳答案
试试 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"))
}
关于r - 有效地将命名列表转换为 data.frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53867718/