我用来在R中$添加一个列表列data.table.当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
Run Code Online (Sandbox Code Playgroud)
但是,当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
Run Code Online (Sandbox Code Playgroud)
这似乎不一致.它是一个功能还是一个bug?
相比之下,使用data.frames 执行相同的操作会返回预期的输出,而不管其中的行数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
Run Code Online (Sandbox Code Playgroud)
这是一种奇怪的行为。请随意打开一个有关它的问题。$由于此类问题及其静态特性,我无论如何都不喜欢。
对于我喜欢的列表[[]]
让你的行为保持一致,如下所示:
dt1 <- data.table(x = 1)
dt1[["y"]]<-list(c(1, 1))
dt2 <- data.table(x = 1:2)
dt2[["y"]] <- list(c(1, 1), c(2, 2))
Run Code Online (Sandbox Code Playgroud)