我目前正在使用 R
中 data.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/