r - 避免 data.table 强制 j 中的列表返回一列
问题描述
假设我有以下data.table
library(data.table)
set.seed(20200210)
data <- data.table(
x = 1:3,
y = list(
data.table(a=4:6, b=runif(3)),
data.table(a=7:10, b=runif(4)),
data.table(a=11:15, b=runif(5))
)
)
data[]
## x y
## 1: 1 <data.table>
## 2: 2 <data.table>
## 3: 3 <data.table>
当我们查看y
'sdata.tables
时,我们得到以下内容
data[, y]
## [[1]]
## a b
## 1: 4 0.1019356
## 2: 5 0.5566203
## 3: 6 0.7020533
##
## [[2]]
## a b
## 1: 7 0.6080464
## 2: 8 0.4421555
## 3: 9 0.5070702
## 4: 10 0.8181770
##
## [[3]]
## a b
## 1: 11 0.8444425
## 2: 12 0.5701193
## 3: 13 0.8412783
## 4: 14 0.5692414
## 5: 15 0.8402453
到目前为止,一切正常。我接下来要做的是a+b
对每个执行操作并使用语法data.table
检索结果。直觉上,我会写以下list
data.table
data[, lapply(y, function(z){
z[, a+b]
})]
## V1 V2 V3
## 1: 4.101936 7.608046 11.84444
## 2: 5.556620 8.442156 12.57012
## 3: 6.702053 9.507070 13.84128
## 4: 4.101936 10.818177 14.56924
## 5: 5.556620 7.608046 15.84025
## Warning messages:
## 1: In as.data.table.list(jval, .named = NULL) :
## Item 1 has 3 rows but longest item has 5; recycled with remainder.
## 2: In as.data.table.list(jval, .named = NULL) :
## Item 2 has 4 rows but longest item has 5; recycled with remainder.
但它不会工作。我的理解是,由于 mylapply
将返回 alist
并且它在内部定义,因此即使结果长度不同data.table[]
,它也会强制返回为一列。data.table
对我来说,这种行为是不可取的。我认为只有在长度匹配时才应将结果简化为一列。
但是,以下内容实际上会起作用
lapply(data$y, function(z){
z[, a+b]
})
## [[1]]
## [1] 4.101936 5.556620 6.702053
##
## [[2]]
## [1] 7.608046 8.442156 9.507070 10.818177
##
## [[3]]
## [1] 11.84444 12.57012 13.84128 14.56924 15.84025
data.table
但如果可以访问该data
对象,我宁愿使用语法。
有什么提示吗?
解决方案
它试图转换为单列,但list
元素的长度不同。我们可以把它包装在一个list
data[, lapply(y, function(z) list(z[, a + b]))]
或者,如果我们需要与输入中相同的结构,请在lapply
out <- data[, list(lapply(y, function(z) z[, .(a +b)]))]
out
# V1
#1: <data.table>
#2: <data.table>
#3: <data.table>
或者也可以
data[, .(lapply(y, function(z) z[, a +b]))]
# V1
#1: 4.101936,5.556620,6.702053
#2: 7.608046, 8.442156, 9.507070,10.818177
#3: 11.84444,12.57012,13.84128,14.56924,15.84025
推荐阅读
- angular - Angular 构建错误:请添加 @NgModule 注释 - ng-click-outside?
- python - 在 python 中读取 .opus 音频文件
- mysql - MySQL 未启动 - XAMPP
- javascript - 使用 react-google-maps/api 时如何正确处理路线更改?
- python - 如何在 tkinter 中定位布局?
- typescript - 无法使用玩笑模拟 S3 `deleteObjects`
- visual-studio-code - 远程 ssh 连接失败,在 vscode 的输出中出现此错误消息(我正在使用 ssh 扩展从 linux 服务器 18 连接到 mac)
- r - 控制许多拼凑而成的 ggplots 的宽度
- c# - 无法将“System.DBNull”类型的对象转换为“System.DateTime”类型
- sql - SQL Server 2019 标量函数返回前 9 个字符不是完整的结果