r - 将列表列添加到 R 中的数据表会返回不一致的输出 - 功能还是错误?
问题描述
我使用$
将列表列添加到data.table
R 中的 a。当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 关于使用[[<-
操作符的建议之外,如果使用双嵌套,也可以确保一致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>
请注意,indata.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>
推荐阅读
- python - 零丢包率的丢包层
- asp.net - 正则表达式:数字或 2 个数字,以 ' - ' 分隔
- regex - 资源正则表达式导致恐慌
- python - 无需在 Python 中复制数据的多处理
- python - 如何有效地在 pandas DataFrame 中生成 AR(1) 进程
- reactjs - 让状态成为对象而不是字符串被认为是最佳实践吗?
- c++ - 保持 shared_ptr use_count() 为 1
- reactjs - 'useEffect',缺少返回类型注释,隐含有一个'any'返回类型.ts(7010)
- java - 当通过 and 限制索引范围时,Hotspot 可以消除边界检查吗?
- jenkins - 使用 ${currentBuild.number} 在 jenkins 中发送松弛消息