[英]R data.table setting values
我正在嘗試使用以下代碼設置以下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'))
並且以下方法不起作用。
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])]
它失敗並帶有以下代碼
Error in `[<-.data.table`(`*tmp*`, id == s & date_id == d, list(names(b)[3:4]), :
j must be atomic vector, see ?is.atomic
我做錯了什么以及如何將這些值從一個data.table設置為另一個元素。 實際的表有很多列,所以手寫它們不是我的選擇。
謝謝
您的示例中存在多個問題。
首先,如果要以dt[ , "col" ]
的形式訪問data.table中的列,則必須添加with=FALSE
:
b[ , names(b)[3:4], with = FALSE ]
其次,我不確定是否可以使用賦值運算符( <-
)在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
]
第三,通過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
]
第四,這一切都在我看來好像你想要一個簡單的兩個表連接。 所以最直接的是
a[ b[ , list(date_id, id) ] ]
或考慮您的意見,您只需要覆蓋列px
和vol
由子a
:
b[a, c("px", "vol") := a[, list(px, vol)], with = FALSE ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.