gpt4 book ai didi

rbindlist 和嵌套的 data.table,使用/不使用 get 的不同行为

转载 作者:行者123 更新时间:2023-12-03 17:43:05 25 4
gpt4 key购买 nike

我正在使用 jsonlite 加载一些 JSON 数据这导致一些嵌套数据(在结构上)类似于玩具 data.table dt下面构造。我希望能够使用 rbindlist绑定(bind)嵌套 data.table一起。

设置:

> dt <- data.table(a=c("abc", "def", "ghi"), b=runif(3))
> dt[, c:=list(list(data.table(d=runif(4), e=runif(4))))]
> dt
a b c
1: abc 0.2623218 <data.table>
2: def 0.7092507 <data.table>
3: ghi 0.2795103 <data.table>

使用 data.table 中内置的 NSE , 我可以:
> rbindlist(dt[, c])
d e
1: 0.8420476 0.26878325
2: 0.1704087 0.59654706
3: 0.6023655 0.42590380
4: 0.9528841 0.06121386
5: 0.8420476 0.26878325
6: 0.1704087 0.59654706
7: 0.6023655 0.42590380
8: 0.9528841 0.06121386
9: 0.8420476 0.26878325
10: 0.1704087 0.59654706
11: 0.6023655 0.42590380
12: 0.9528841 0.06121386

这正是我所期望/想要的。此外,原 dt保持不变:
> dt
a b c
1: abc 0.2623218 <data.table>
2: def 0.7092507 <data.table>
3: ghi 0.2795103 <data.table>

但是,当操作 data.table在我通常想使用的函数中 get带有字符串列名:
> rbindlist(dt[, get("c")])
V1 V2
1: 0.8420476 0.26878325
2: 0.1704087 0.59654706
3: 0.6023655 0.42590380
4: 0.9528841 0.06121386
5: 0.8420476 0.26878325
6: 0.1704087 0.59654706
7: 0.6023655 0.42590380
8: 0.9528841 0.06121386
9: 0.8420476 0.26878325
10: 0.1704087 0.59654706
11: 0.6023655 0.42590380
12: 0.9528841 0.06121386

现在,列名已丢失并被默认的“V1”和“V2”值替换。有没有办法保留名字?

在开发版本(v1.9.5)中,问题比简单地丢失名称更糟糕。执行语句后: rbindlist(dt[, get("c")])整个 data.table变得腐败:
> dt
Error in FUN(X[[3L]], ...) :
Invalid column: it has dimensions. Can't format it. If it's the result of data.table(table()), use as.data.table(table()) instead.

需要明确的是,丢失名称的问题发生在 v1.9.4(从 CRAN 安装)和 v1.9.5(从 gi​​thub 安装)中,但是损坏的 data.table问题似乎仅影响 v1.9.5(截至今天 - 2015 年 7 月 8 日)。

如果我能够坚持使用 NSE 版本的东西,一切都会顺利进行。我的问题是坚持使用 NSE 版本将涉及编写多个相互调用的 NSE 函数,这似乎很快就会变得困惑。

是否有任何(非基于 NSE 的)已知解决方法?另外,这是一个已知问题吗?

最佳答案

自从询问此 Q 以来,这必须在过去 5 年中修复。现在我得到了预期的结果。

> library(data.table)
data.table 1.13.3 IN DEVELOPMENT built 2020-11-17 18:11:47 UTC; jan using 4 threads (see ?getDTthreads). Latest news: r-datatable.com
> dt <- data.table(a=c("abc", "def", "ghi"), b=runif(3))
> dt[, c:=list(list(data.table(d=runif(4), e=runif(4))))]
> dt
a b c
1: abc 0.2416624 <data.table[4x2]>
2: def 0.0222938 <data.table[4x2]>
3: ghi 0.3510681 <data.table[4x2]>
> rbindlist(dt[, c])
d e
1: 0.5485731 0.32366420
2: 0.5457945 0.45173251
3: 0.6796699 0.03783026
4: 0.4442776 0.03121024
5: 0.5485731 0.32366420
6: 0.5457945 0.45173251
7: 0.6796699 0.03783026
8: 0.4442776 0.03121024
9: 0.5485731 0.32366420
10: 0.5457945 0.45173251
11: 0.6796699 0.03783026
12: 0.4442776 0.03121024
> rbindlist(dt[, get("c")])
d e
1: 0.5485731 0.32366420
2: 0.5457945 0.45173251
3: 0.6796699 0.03783026
4: 0.4442776 0.03121024
5: 0.5485731 0.32366420
6: 0.5457945 0.45173251
7: 0.6796699 0.03783026
8: 0.4442776 0.03121024
9: 0.5485731 0.32366420
10: 0.5457945 0.45173251
11: 0.6796699 0.03783026
12: 0.4442776 0.03121024
> dt
a b c
1: abc 0.2416624 <data.table[4x2]>
2: def 0.0222938 <data.table[4x2]>
3: ghi 0.3510681 <data.table[4x2]>

关于rbindlist 和嵌套的 data.table,使用/不使用 get 的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31294559/

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