r - lapply 与嵌套列表

标签 r list data.table

我有一个嵌套列表,我想在最深的嵌套级别上lapply as.data.frame,然后rbindlist(来自data.table)一切。我的数据如下所示:

a <- list(date="2017-01-01",ret=1:5)
b <- list(date="2017-01-02",ret=7:9)
lvl3 <- list(a,b) 
lvl2 <- list(lvl3,lvl3)
lvl1 <- list(lvl2,lvl2,lvl2)

如果我只有 lvl3,我会将其转换为 data.framerbind 数据:

rbindlist(lapply(lvl3,as.data.frame))
         date ret
1: 2017-01-01   1
2: 2017-01-01   2
3: 2017-01-01   3
4: 2017-01-01   4
5: 2017-01-01   5
6: 2017-01-02   7
7: 2017-01-02   8
8: 2017-01-02   9

我该如何从lvl1和rbind所有嵌套的data.frames中做到这一点?这不起作用:

rbindlist(lapply(lvl1,as.data.frame))

所需结果包含 48 行:

         date ret
 1: 2017-01-01   1
 2: 2017-01-01   2
 3: 2017-01-01   3
 4: 2017-01-01   4
 5: 2017-01-01   5
 6: 2017-01-02   7
 7: 2017-01-02   8
 8: 2017-01-02   9
 9: 2017-01-01   1
10: 2017-01-01   2
11: 2017-01-01   3
12: 2017-01-01   4
13: 2017-01-01   5
14: 2017-01-02   7
15: 2017-01-02   8
16: 2017-01-02   9
17: 2017-01-01   1
18: 2017-01-01   2
19: 2017-01-01   3
20: 2017-01-01   4
21: 2017-01-01   5
22: 2017-01-02   7
23: 2017-01-02   8
24: 2017-01-02   9
25: 2017-01-01   1
26: 2017-01-01   2
27: 2017-01-01   3
28: 2017-01-01   4
29: 2017-01-01   5
30: 2017-01-02   7
31: 2017-01-02   8
32: 2017-01-02   9
33: 2017-01-01   1
34: 2017-01-01   2
35: 2017-01-01   3
36: 2017-01-01   4
37: 2017-01-01   5
38: 2017-01-02   7
39: 2017-01-02   8
40: 2017-01-02   9
41: 2017-01-01   1
42: 2017-01-01   2
43: 2017-01-01   3
44: 2017-01-01   4
45: 2017-01-01   5
46: 2017-01-02   7
47: 2017-01-02   8
48: 2017-01-02   9

最佳答案

您可以构建自己的递归函数,à la

f <- function(l) {
  data.table::rbindlist(lapply(l, function(x) {
    if(all(sapply(x, is.atomic))) as.data.table(x) else f(x)
  }))
}
f(lvl1)

这将返回一个 48 行 2 列的普通 data.table。

另请注意,这适用于 lvl1lvl2lvl3,无需修改。

关于r - lapply 与嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44653695/

相关文章:

r - 更改 R 中的绘图标签大小,cex 不起作用

r igraph edge.lty 属性未按宣传的那样工作

r - 是否可以像 dcast 一样在 tidyr 中的多列上使用扩展?

java - 将列表中的对象转换为子类

r - data.table:对两个维度进行切片,字符串列列表

r - 将数据表中的行熔化或复制一定次数并在 R 中包含计数器

r - group_by操作后dplyr如何为每个组生成数据帧?

python - 将字符串转换为包含负数的整数列表

Python-从文件中读取两个列表作为列表

r - R 中 data.table 的累积计算(例如累积相关性)