2016-08-31 8 views
2

これは基本的にはquestionの拡張であり、2番目のサブセットを設定している場合は列の値を変更できないことに気づいたためです。ランダムに選択したdata.tableサブセットの値を変更する

random.length <- sample(x = 15:30, size = 1) 
dt <- data.table(city=sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"), size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE)) 
set.seed(1) 
dt[sample(.N,3), score :=9999] 
set.seed(1) 
dt[sample(.N,3),] 

これは予想どおりに機能し、3つのランダムに選択された都市のスコアを9999に変更します。最初のステップでサブセットしてからサンプリングを行い、新しいスコア値を割り当てようとすると、それは不可能です。私が達成したい何

set.seed(1) 
dt[city == "New York",][sample(.N,1), score := 55555] 
set.seed(1) 
dt[city == "New York",][sample(.N,1)] 

は、私は、特定のサブセットの一部であり、ランダムにこのサブセットから選択されますいくつかの列の値を変更することができるということです。

+0

- あなたの選択した行ではなく、都市。ちなみに、 'set.seed'は(' sample'が使われた後で)遅すぎます。 – Frank

+0

set.seed()は、最初のケースではスコアが変化し、別のスコアを直接チェックすることができ、2番目のケースでは何も変化しないことを、見やすくするためだけにあります。 – hannes101

+2

'dt [sample(dt [、.I [city ==" New York "]]、3)、score:= 55555]'可能かもしれません。あるいは、各都市で3つのランダムなobsを無効にしたい場合、 'dt [dt [、.I [sample(.N、3)] by = city] $ V1、score:= 55555]' –

答えて

5

また、上記のすべての提案のほかに(which機能を使用して計算することができます)インデックスをサンプリングすることができます:「3つのランダムに選択された都市の」

dt[sample(which(city == "New York"), 1), score:=555L] 
dt 
#   city score 
# 1: Tel Aviv  8 
# 2: Amsterdam  3 
# 3: Cape Town 10 
# 4: New York  1 
# 5: Cape Town 10 
# 6: Pittsburgh  2 
# 7: Pittsburgh  8 
# 8: Amsterdam 10 
# 9: Amsterdam  8 
# 10: Amsterdam  4 
# 11: Tel Aviv  7 
# 12: Amsterdam  2 
# 13: Pittsburgh  1 
# 14: Amsterdam  3 
# 15: Pittsburgh  2 
# 16: New York  7 
# 17: Tel Aviv 10 
# 18: New York 10 
# 19: Cape Town  1 
# 20: Amsterdam  7 
# 21: Amsterdam  3 
# 22: New York 555 
# 23: Cape Town  6 
# 24: New York  1 
# 25: Tel Aviv 10 
#   city score 
5

​​は、完全に新しいオブジェクトを返します。これは、参照によって更新しています。しかし、ではなく、dtに影響します。即ち、

dt[expr, col := val] != dt[expr][, col := val] 

exprTRUEに評価dt第一の発現アップデート。 2番目はdt[expr]から返されたサブセットを更新します。結果を変数に代入しない限り、結果を返す方法はありません。

+0

さて、それは私が疑ったことです、素早い答えをありがとう。 – hannes101

+0

私は割り当てに関して少し奇妙なことを見つけました:=というのは、意味のあるエラーまたはエラーメッセージをまったくあなたに与えないということです。特にこの場合、何かを割り当てることに実際に何の点もない場合は、少し奇妙です。最初は成功したようです。そのような場合に何とかエラーを表示することは可能でしょうか? – hannes101

関連する問題