2016-09-22 4 views
3

私はdata.table 1.9.6を使用しています。ここではいくつかの簡単なコードと出力されます。data.table/data.frame rbindは正常に動作しません

df <- data.table(a=c(NA,NA,2,2),b=c(1,1,2,2)) 
nrow(df[is.na(a)]) + nrow(df[!is.na(a)]) 
# [1] 4 
nrow(rbind(df[is.na(a)],df[!is.na(a)])) 
# [1] 4 
nrow(rbind(df[is.na(a),b := a],df[!is.na(a)])) 
# [1] 6 
rbind(df[is.na(a),b := a],df[!is.na(a)]) 
#  a b 
# 1: NA NA 
# 2: NA NA 
# 3: 2 2 
# 4: 2 2 
# 5: 2 2 
# 6: 2 2 
rbind(df[is.na(a),a := b],df[!is.na(a)]) 
#  a b 
# 1: NA NA 
# 2: NA NA 
# 3: 2 2 
# 4: 2 2 
# 5: 2 2 
# 6: 2 2 

is.na()!is.na()後、本質的にちょうどrbindはすぐに私は他の列の値rbind(df[is.na(a),a := b],df[!is.na(a)])何かの区切りでカラム内NA値を置換しようとして私に細かな結果を与えるが。むしろ非論理的なrbind(df[is.na(a),b := a],df[!is.na(a)])も壊れます。誰かが私が逃していることを説明することができますかこれはバグですか?

私が試し動くものを維持するための更なる:

rbind(data.frame(df[is.na(a),a := b]),data.frame(df[!is.na(a)])) 
# a b 
# 1 NA NA 
# 2 NA NA 
# 3 2 2 
# 4 2 2 
# 5 2 2 
# 6 2 2 

だからこれは私がdata.frameに変換した後も動作しません。

+1

'dtの[条件、COL:=何とか]'全体を返します。 (現在変更されている) 'data.table'' dt'です。そういうわけで、あなたが得るものを手に入れます。 – eddi

答えて

5

問題は、:=を使用してインプレースで条件が更新されますが、条件を無視してデータセット全体が返されることです。

どちらのインプレース更新しないように、この構文を使用します。

rbind(df[is.na(a),.(a,b = a)],df[!is.na(a)]) 
    a b 
1: NA NA 
2: NA NA 
3: 2 2 
4: 2 2 

またはこの更新のみにその場で

df[is.na(a),b := a] 
df 
    a b 
1: NA NA 
2: NA NA 
3: 2 2 
4: 2 2 
+3

私は 'rbind(df [is.na(a)] [、b:= a]、df [!is.na(a)]) – eddi

関連する問題