2

我目前正在使用包中的set函数进行一些测试,并具有以下代码:data.tableR

  dt= data.table(ans=rep(c(14,16),100))
  dt[,voy:=0.0]
  set(dt,which(dt[,ans]==14),"voy",log(dt[,ans]))
  dt

请注意,我想计算ans=14使用该set函数的情况的对数,但我没有得到正确的结果。这是我得到的结果:

  ans      voy
  1:  14 2.639057
  2:  16 0.000000
  3:  14 2.772589
  4:  16 0.000000
  5:  14 2.639057
  ---             
  196:  16 0.000000
  197:  14 2.639057
  198:  16 0.000000
  199:  14 2.772589
  200:  16 0.000000

您可能会注意到,对于某些行,变量的值voy是预期的log(14)=2.639057,但对于其他情况,变量的值ans=14是赋值的2.772589=log(16)。所以,我认为我在滥用该set功能。我该如何解决这个问题?我知道下一个代码可用于执行此操作:

dt[ans==14,voy:=log(ans)]

但我想把它翻译成set函数语法。

4

1 回答 1

4

您需要对 value 参数的数据进行子集化。在您的情况下,警告Supplied 200 items to be assigned to 100 items of column 'voy' (100 used)可能会给您一个想法。您正在逐一挑选 的前 100 个值dt$ans,它们确实是交替的 14 和 16 值。

这样它的工作原理:

set(dt,which(dt[,ans]==14),"voy",log(dt[ans==14,ans]))

给予:

     ans      voy
  1:  14 2.639057
  2:  16 0.000000
  3:  14 2.639057
  4:  16 0.000000
  5:  14 2.639057
 ---             
196:  16 0.000000
197:  14 2.639057
198:  16 0.000000
199:  14 2.639057
200:  16 0.000000

但正如@Andrie 已经指出的那样,这是丑陋的代码。

于 2012-08-22T19:57:26.993 回答