我正在尝试使用以下代码设置以下data.tables px&vol.(回到缓慢的循环)
a=data.table(
date_id = rep(seq(as.Date('2013-01-01'),as.Date('2013-04-10'),'days'),5),
px =rnorm(500,mean=50,sd=5),
vol=rnorm(500,mean=500000,sd=150000),
id=rep(letters[1:5],each=100)
)
b=data.table(
date_id=rep(seq(as.Date('2013-01-01'),length.out=600,by='days'),5),
id=rep(letters[1:5],each=600),
px=NA_real_,
vol=NA_real_
)
setkeyv(a,c('date_id','id'))
setkeyv(b,c('date_id','id'))
Run Code Online (Sandbox Code Playgroud)
并且以下方法不起作用.
s = a[1,id]
d = a[1,date_id]
b[id == s & date_id == d, list(names(b)[3:4])] <- a[id == s & date_id ==d, list(names(a)[2:3])]
Run Code Online (Sandbox Code Playgroud)
它失败并带有以下代码
Error in `[<-.data.table`(`*tmp*`, id == s & date_id == d, list(names(b)[3:4]), :
j must be atomic vector, see ?is.atomic
Run Code Online (Sandbox Code Playgroud)
我做错了什么以及如何将这些值从一个data.table设置为另一个元素.实际的表有很多列,所以手写它们不是我的选择.
谢谢
您的示例中存在多个问题.
首先,如果要访问dt[ , "col" ]必须添加的表单中的data.table中的列with=FALSE:
b[ , names(b)[3:4], with = FALSE ]
Run Code Online (Sandbox Code Playgroud)
其次,我不确定是否可以使用赋值运算符(<-)在data.table中赋值.为此,有一个超快速的引用更新操作符:
b[
id == s & date_id == d,
names(b)[3:4] := a[id == s & date_id ==d, names(a)[2:3], with = FALSE],
with = FALSE
]
Run Code Online (Sandbox Code Playgroud)
第三,按dt[ col == value, ]语法对data.tables进行子集化是可能的,但速度很慢.特别是如果您已经在要按子集列的列上设置了键,则应使用以下语法:
b[
J(d,s),
names(b)[3:4] := a[J(d,s), names(a)[2:3], with = FALSE] ,
with = FALSE
]
Run Code Online (Sandbox Code Playgroud)
第四,这一切都在我看来好像你想要一个简单的两个表连接.所以最直接的是
a[ b[ , list(date_id, id) ] ]
Run Code Online (Sandbox Code Playgroud)
或者考虑一下您的评论,您只想通过以下方式覆盖列px和vol子集a:
b[a, c("px", "vol") := a[, list(px, vol)], with = FALSE ]
Run Code Online (Sandbox Code Playgroud)