gpt4 book ai didi

r - 将列表列添加到 R 中的数据表会返回不一致的输出 - 功能还是错误?

转载 作者:行者123 更新时间:2023-12-04 14:38:28 25 4
gpt4 key购买 nike

我用 $将列表列添加到 data.table在 R. 当 data.table有不止一行,这按预期工作。

library(data.table)

dt2 <- data.table(x = 1:2)
dt2$y <- list(c(1, 1), c(2, 2))
dt2
#> x y
#> 1: 1 1,1
#> 2: 2 2,2

然而,当 data.table只有一行,仅返回列表中向量的第一个元素并显示警告:
dt1 <- data.table(x = 1)
dt1$y <- list(c(1, 1))
#> Warning in `[<-.data.table`(x, j = name, value = value): Supplied 2 items
#> to be assigned to 1 items of column 'y' (1 unused)
dt1
#> x y
#> 1: 1 1

这似乎不一致。这是一个功能还是一个错误?

相比之下,用 data.frame 做同样的事情s 返回预期的输出,而不管 data.frame 中的行数如何。 .
df1 <- data.frame(x = 1)
df1$y <- list(c(1, 1))
df1
#> x y
#> 1 1 1, 1

df2 <- data.frame(x = 1:2)
df2$y <- list(c(1, 1), c(2, 2))
df2
#> x y
#> 1 1 1, 1
#> 2 2 2, 2

最佳答案

除了 Andre Elrico's suggestion使用 [[<-如果双重嵌套 list(),也可以确保操作符一致的行为。用来。这适用于 $<-运算符以及 data.table:=赋值运算符。
2排案例

library(data.table)
dt2 <- data.table(x = 1:2)
dt2$y <- list(list(c(1, 1), c(2, 2)))
str(dt2)

dt2 <- data.table(x = 1:2)
dt2[, y := .(.(c(1, 1), c(2, 2)))]
str(dt2)
在两种变体中 str(dt2)返回相同的:
Classes ‘data.table’ and 'data.frame':    2 obs. of  2 variables:
$ x: int 1 2
$ y:List of 2
..$ : num 1 1
..$ : num 2 2
- attr(*, ".internal.selfref")=<externalptr>

请注意在 data.table语法 list()可以缩写为 .() .
为了进行比较,这里是 OP 使用的代码
dt2 <- data.table(x = 1:2)
dt2$y <- list(c(1, 1), c(2, 2))
str(dt2)
创建相同的结构
Classes ‘data.table’ and 'data.frame':    2 obs. of  2 variables:
$ x: int 1 2
$ y:List of 2
..$ : num 1 1
..$ : num 2 2
- attr(*, ".internal.selfref")=<externalptr>

1排案例
dt1 <- data.table(x = 1)
dt1$y <- list(list(c(1, 1)))
str(dt1)

dt1 <- data.table(x = 1)
dt1[, y := .(.(c(1, 1)))]
str(dt1)
再次, str(dt1) 的输出两种代码变体都相同,也与 2 行情况一致。
Classes ‘data.table’ and 'data.frame':    1 obs. of  2 variables:
$ x: num 1
$ y:List of 1
..$ : num 1 1
- attr(*, ".internal.selfref")=<externalptr>

关于r - 将列表列添加到 R 中的数据表会返回不一致的输出 - 功能还是错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51531042/

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