gpt4 book ai didi

r - 通过将行折叠到新的 data.tables 中来创建嵌套的 data.tables

转载 作者:行者123 更新时间:2023-12-04 07:00:54 25 4
gpt4 key购买 nike

如何创建包含嵌套 data.tables 的 data.table?

例子

set.seed(7908)
dt <- data.table(x=1:5)[,list(y=letters[1:x],z=sample(1:100,x)),by=x]

dt
## x y z
## 1: 1 a 13
## 2: 2 a 27
## 3: 2 b 87
## 4: 3 a 85
## 5: 3 b 98
## 6: 3 c 1
## 7: 4 a 53
## 8: 4 b 81
## 9: 4 c 64
## 10: 4 d 45
## 11: 5 a 28
## 12: 5 b 26
## 13: 5 c 52
## 14: 5 d 55
## 15: 5 e 12

期望输出

对于 dt 中 x 的每个唯一值,折叠行并创建一个包含 y 列和 z 列的 data.table,该列包含在 dt 的单个列中。结果应如下所示:
##    x        dt.yz
## 1: 1 <data.table>
## 2: 2 <data.table>
## 3: 3 <data.table>
## 4: 4 <data.table>
## 5: 5 <data.table>

在我的实际示例中,我有几个具有不同列的数据表,我想将它们存储在单个元数据表中。

最佳答案

使用 y 和 z 作为列创建 data.table,然后将其包装在一个列表中,以便它可以“填充”在一行中。将其包装在另一个列表中,您可以在其中分配结果列名称。使用 by=x为 x 的每个唯一值执行此操作。

dt2 <- dt[, list(dt.yz=list(data.table(y, z))), by=x]
dt2
## x dt.yz
## 1: 1 <data.table>
## 2: 2 <data.table>
## 3: 3 <data.table>
## 4: 4 <data.table>
## 5: 5 <data.table>

正如 Arun 指出的,使用 .SD更短更快,可能更方便:
dt2 <- dt[, list(dt.yz=list(.SD)), by=x]
## dt.yz will include all columns not in the `by=`;
## Use `.SDcols=` to select specific columns

稍后要获取data.table的值,根据x的期望值对元data.table(dt2)进行子集化,然后获取dt的列表中的第一个元素(即嵌套的data.table)。 yz 列。
dt2[x==5,dt.yz[[1]]]
## y z
## 1: a 28
## 2: b 26
## 3: c 52
## 4: d 55
## 5: e 12

关于r - 通过将行折叠到新的 data.tables 中来创建嵌套的 data.tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25430986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com