【发布时间】:2017-10-24 21:54:04
【问题描述】:
我收到了一个大的list,格式如下:
example <- list("12908430751", "12908453145", c("12908453145","12908472085","453145472085"), c("12908453145", "12908472085", "453145472085"), "12908453145", c("12908453145", "12908472085", "453145472085"))
example
[[1]]
[1] "12908430751"
[[2]]
[1] "12908453145"
[[3]]
[1] "12908453145" "12908472085" "453145472085"
[[4]]
[1] "12908453145" "12908472085" "453145472085"
[[5]]
[1] "12908453145"
[[6]]
[1] "12908453145" "12908472085" "453145472085"
虽然使用 library(reshape2); melt(example) 适用于较小的数据集,但我的实际数据需要很长时间(约 600 万个元素)。我想知道是否有更有效的方法来实现这一点。
Output
value L1
1 12908430751 1
2 12908453145 2
3 12908453145 3
4 12908472085 3
5 453145472085 3
6 12908453145 4
7 12908472085 4
8 453145472085 4
9 12908453145 5
10 12908453145 6
11 12908472085 6
12 453145472085 6
我发现了类似 Melt data.frame containing list to long format (efficiently) 的内容,但未能适应我的情况。
结果
example1 拥有 100 万个元素
system.time({foo <- unlist(lapply(example1, function(x) length(x)))
result <- data.frame(value = unlist(example1),
L1 = unlist(sapply(1:length(foo), function(x) rep(x, foo[x]))))})
用户系统已过
9.63 0.10 9.73
system.time({
df <- structure(list(value = example1 , id = 1:length(example1)), .Names =
c("value", "L1"), row.names = 1:length(example), class = "data.frame")
result1 <- setDT(df)[, .(value = unlist(value)), by = .(L1)]})
用户系统已过
1.25 0.00 1.26
system.time({result3 <- tibble(L1 = 1:length(example1), value = example1) %>% unnest()})
用户系统已过
5.99 0.00 5.98
system.time({ stack(setNames(example1, seq_along(example)))})
用户系统已过
1.08 0.00 1.08
无法让并行版本以结果结尾,但可能支持我。尽管我没有定义效率,但我还是选择了最快的方法。
【问题讨论】:
-
这远不是最快的,但根据我的测试,
stack(setNames(example, seq_along(example)))将比melt快一个数量级。 -
这里的答案似乎很合适而且很快 - stackoverflow.com/questions/31551036/…
-
而且,至少对我而言,@thelatemail 的建议比发布的任何其他解决方案(包括我自己的)都更简洁易读
-
同意,如果@thelatemail 添加他的评论作为答案,我可以接受
-
@user6617454 - 完成