我有两列的混合类型,矢量和数据框列表。
> my.list
$a
[1] 1
$df1
key value
1 b 2
2 c 3
$df2
key value
1 d 4
2 e 5
我想最后得到一个向量列表,每个数据帧行将成为一个列表元素,列值为值,列键为元素名称。
所以这个例子的结果是:
$a
[1] 1
$b
[1] 2
$c
[1] 3
$d
[1] 4
$e
[1] 5
其实这就是我如何做到这一点:
my.list <- list(a = 1,
df1 = data.frame(key = c("b", "c"), value = 2:3),
df2 = data.frame(key = c("d", "e"), value = 4:5))
unlist(lapply(seq_along(my.list), function(i) {
if (is.data.frame(my.list[[i]])) {
with(my.list[[i]], as.list(setNames(value, key), all.names = TRUE))
} else {
setNames(my.list[i], names(my.list[i]))
}
}), recursive = FALSE)
但我真的不喜欢这个解决方案。你有更聪明的想法吗?感谢
答案 0 :(得分:5)
您可以分两步执行R
:
x = do.call(rbind, Filter(is.data.frame, my.list))
c(Filter(Negate(is.data.frame), my.list), as.list(setNames(x$value, x$key)))
$a
[1] 1
$b
[1] 2
$c
[1] 3
$d
[1] 4
$e
[1] 5
答案 1 :(得分:4)
一个选项(基于示例)将是melt
(从reshape2
)到'long'格式,转换为data.table
(setDT
),替换“key”中的NA元素与“L1”中的相应值以及split
基于“key”的“value”。
library(data.table)
library(reshape2)
with(setDT(melt(my.list))[is.na(key), key := L1], split(value, key))