我正在寻找一种有效的方法来进行以下转换:
示例输入:
ob <-list(a = 2,b = 3)
预期输出:
键值
1一2
2 b 3
当前(详细)解决方案:
data.frame(键=名称(ob),值=取消列表(ob,use.names = FALSE))
答案 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"))
}