假设我有以下 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
时的data.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.
但它不会工作。我的理解是,自从我的lapply
将返回 list
它是在 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
元素的长度不同。我们可以将其包装在列表
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
关于r - 避免 data.table 强制 j 中的列表返回列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60157013/