我目前正使用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
函数语法。
答案 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已经说过的那样。