2016-04-17 12 views
2

私はちょっと驚きました。私は、dt_1で行要素を置き換えるためにset()を使用した場合、dt_3の対応する要素は、同様に変更された:data.tableのset()を使用して以前に定義された変数を強制的に呼び出す

refcols=c("A","B") 
dt_3 = data.table(A=c(1,1,3,5,6,7), B = c("x","y","z","q","w","e"), C = rep("NO",6)) 
dt_2 = data.table(A=c(3,5,7), B = c("z","q","x"), D=c(3,5,99)) 
dt_1 = dt_3 
dt_3 
    A B C 
1: 1 x NO 
2: 1 y NO 
3: 3 z NO 
4: 5 q NO 
5: 6 w NO 
6: 7 e NO 

for(j in refcols){ 
    set(dt_1,2,j,dt_2[3,get(j)]) 
} 
Warning messages: 
1: In set(dt_1, 2, j, dt_2[3, get(j)]) : 
    Coerced i from numeric to integer. Please pass integer for efficiency; e.g., 2L rather than 2 
2: In set(dt_1, 2, j, dt_2[3, get(j)]) : 
    Coerced i from numeric to integer. Please pass integer for efficiency; e.g., 2L rather than 2 

dt_3 
    A B C 
1: 1 x NO 
2: 7 x NO 
3: 3 z NO 
4: 5 q NO 
5: 6 w NO 
6: 7 e NO 

これを引き起こし、このような特定の列の明示的な行インデックスによってサブセットに簡単な方法が存在している何?

+1

この警告は正確には何を意味していますか? 'set'の' i'引数に '2L'の代わりに' 2'を書いています。警告を読んで '?set'を読んでください – Frank

答えて

1

我々はcopyを使用することができますので、我々は1データセット内の要素を交換する際に、第二の部分に関しては、他の文句を言わない」変更

dt_1<- copy(dt_3) 

が、それは行インデックスについて非常に明確ではないということ。 「dt_1」の「A」と「B」の欄の2行は、ベース(対応する列の「dt_2」の3番目の行で置き換えなければならない場合にのみ列インデックス

for(j in refcols){ 
set(dt_1, i=NULL, j=j, value=dt_2[[j]]) 
} 

dt_1 
# A B C 
#1: 3 z NO 
#2: 5 q NO 
#3: 7 x NO 
#4: 3 z NO 
#5: 5 q NO 
#6: 7 x NO 

に基づく場合「refcols」)

for(j in refcols){ 
set(dt_1, i=2L, j=j, value=dt_2[[j]][3]) 
} 

dt_1 
# A B C 
#1: 1 x NO 
#2: 7 x NO 
#3: 3 z NO 
#4: 5 q NO 
#5: 6 w NO 
#6: 7 e NO 
+1

2番目の部分については後者の解釈が正しいですが、質問の最初の部分への答えは私が(質問のタイトルごとに)探していた主なものです。心から感謝する... –

関連する問題