我做错了什么(data.table,R)?

时间:2012-08-22 18:52:41

标签: r data.table

我目前正使用set data.table包中的R函数进行一些测试,并输入以下代码:

  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函数语法。

1 个答案:

答案 0 :(得分:4)

您需要为value参数的数据进行子集化。在您的情况下,警告提供了200个项目,分配给100个列的项目' voy' (100未使用)可以给你一个想法。你逐一挑选dt$ans的前100个值,这些值实际上是交替的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已经说过的那样。