簡體   English   中英

R data.table設置值

[英]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) ] ]

或考慮您的意見,您只需要覆蓋列pxvol由子a

b[a, c("px", "vol") := a[, list(px, vol)], with = FALSE ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM