【发布时间】:2016-02-17 12:35:58
【问题描述】:
给定一个列表变量,我想要一个包含每个元素位置的数据框。对于一个简单的非嵌套列表来说,这似乎很简单。
例如,这是一个字符向量列表。
l <- replicate(
10,
sample(letters, rpois(1, 2), replace = TRUE),
simplify = FALSE
)
l 看起来像这样:
[[1]]
[1] "m"
[[2]]
[1] "o" "r"
[[3]]
[1] "g" "m"
# etc.
要获取位置的数据框,我可以使用:
d <- data.frame(
value = unlist(l),
i = rep(seq_len(length(l)), lengths(l)),
j = rapply(l, seq_along, how = "unlist"),
stringsAsFactors = FALSE
)
head(d)
## value i j
## 1 m 1 1
## 2 o 2 1
## 3 r 2 2
## 4 g 3 1
## 5 m 3 2
## 6 w 4 1
给定一个更复杂的嵌套列表,例如:
l2 <- list(
"a",
list("b", list("c", c("d", "a", "e"))),
character(),
c("e", "b"),
list("e"),
list(list(list("f")))
)
这不容易概括。
我期望这个例子的输出是:
data.frame(
value = c("a", "b", "c", "d", "a", "e", "e", "b", "e", "f"),
i1 = c(1, 2, 2, 2, 2, 2, 4, 4, 5, 6),
i2 = c(1, 1, 2, 2, 2, 2, 1, 2, 1, 1),
i3 = c(NA, 1, 1, 2, 2, 2, NA, NA, 1, 1),
i4 = c(NA, NA, 1, 1, 2, 3, NA, NA, NA, 1),
i5 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 1)
)
如何获取嵌套列表的位置数据框?
【问题讨论】:
-
您是否期望一个具有 6 列(值 + 5 级嵌套)的 data.frame 作为
l2的结果? -
这似乎本质上是
melt(l2)+rapply(l2, seq_along)的组合。问题是如何轻松地将这两者结合起来:-) -
@AnandaMahto,这非常简单——如果你作为答案发帖,我会支持你
-
@docendodiscimus,发布了答案。它(显然)没有你的方法那么快。