【问题标题】:What am I doing wrong (data.table, R)?我在做什么错(data.table,R)?
【发布时间】:2012-08-22 18:52:40
【问题描述】:

我目前正在使用data.table 包中的set 函数在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

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

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

【问题讨论】:

  • 为什么?你展示了一个可行的、好的替代方案。为什么要用更复杂的东西代替它?
  • 你是对的@Andrie,但我只是想确保我理解set 函数的工作方式。谢谢!

标签: r data.table


【解决方案1】:

您需要对 value 参数的数据进行子集化。在您的情况下,警告 Supplyed 200 items to be assigned to 100 items of column 'voy' (100 used) 可能会给您一个想法。您正在逐一挑选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 已经指出的那样,这是丑陋的代码。

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 2019-05-15
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多