2

私は現在、パッケージ内のset関数を使用していくつかのテストを行っており、次のコードがあります。data.tableR

  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しかし、これを関数構文に変換したいと思います。

4

1 に答える 1

4

valueパラメータのデータをサブセット化する必要があります。あなたの場合、 「ボイ」列の100個のアイテム(100個の未使用)に割り当てられる200個のアイテムを提供するという警告があなたにアイデアを与えた可能性があります。の最初の100個の値を1つずつ選択していましdt$ansた。これは、実際には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

しかし、@ Andrewがすでに述べているように、これは醜いコードです。

于 2012-08-22T19:57:26.993 に答える