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

标签 r data.table

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

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

最佳答案

您需要对值参数的数据进行子集化。在您的情况下,警告Supplied 200 items to be分配给'voy'列的100个项目(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 已经评论过的那样。

关于r - 我做错了什么(data.table,R)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12079578/

相关文章:

r - 散点图的非参数分位数回归曲线

r - 按列索引号 data.table R 过滤

regex - data.table集名与正则表达式结合使用

R:如何读取带有 data.table::fread 的 CSV 文件,其中逗号为小数,点为千位分隔符 ="."

R:如何在集团层面重新采样日内数据?

r - 使用 rmarkdown/knitr 将所有代码保存到最后

以另一个数据帧为条件的数据帧的 R 子集

r - R 中的空间自相关分析 (Global Moran's I)

r - 修复 ggplot 中构面的顺序

r - 创建具有 4M 行的语料库和 DTM 的更有效方法