2016-08-01 10 views
1
dt = data.table(x = c(1,1,2,2,2,2,3,3,3,3)) 
dt[, y := if(.N > 2) .N else NA, by = x] # fail 
dt[, y := if(.N > 2) .N else NA_integer_, by = x] # good 

NAには型があり、整数ではないため、最初のグループ化に失敗します。それを無視し、すべてのNAsを一貫性を保つどんなタイプにもしようとデータテーブルに指示する方法はありますか?R data.table NAタイプ一貫性

私は手動でNA_integerを設定することができますが、多種のタイプのカラムがある場合は、すべてのNAタイプを正しく設定するのは難しいです。

ところで、Date/IDate/ITimeにはどのようなNAタイプを使用しますか?

+0

@RichardScriven 2番目の作品は確信しています。 RStudioを使用していますか? RStuidioは、新しいコマンドが正常に実行されたときに以前のエラーメッセージを表示し続けることがあります。 – jf328

+0

@RichardScrivenああ、私は理由を見る。 2つを順番に実行しないでください。失敗したコマンドは実際にテーブルを変更します – jf328

+0

"x"カラムは "整数"ではありません - '.N'のために"整数 "が必要であると思われますので、' .N'を返すと、別の 'typeof'sに対してハードコード' NA_integer_'を使用します。それ以外の場合は、戻り値(ここでは 'NA')の' storage.mode'を適切な型に設定します。 –

答えて

3

OPの最初の質問:はそれを無視して、一貫性を保つどんなタイプのすべてのNASをしようとするデータテーブルを伝える方法はありますか?

いいえあなたは割り当てなしで同様のエラーが表示されます:私の意見では

dt[, if(.N > 2) .N else NA, by = x] 
# Error in `[.data.table`(dt, , if (.N > 2) .N else NA, by = x) : 
# Column 1 of result for group 2 is type 'integer' but expecting type 'logical'. Column types must be consistent for each group. 

は、この「列タイプは、グループごとに一貫していなければなりません。」あなたのケースについてもメッセージが表示されるはずです。


OPの2番目の質問:ところで、私は日付/ i日付/ ITIMEのために使用すべきかNAタイプ? IDATEらため

、私はいつも、例えば長ワンNAスライスを与えるようNA_integer_、、、as.IDate(Sys.Date())[NA_integer_]によってサブセット。私はそれが何であるかわからない。であるべきだが、私は良いアイデアは知らない。イラスト:

z = IDateTime(factor(Sys.time())) 
#   idate itime 
# 1: 2016-08-01 16:05:25 

str(lapply(z, function(x) x[NA_integer_])) 
# List of 2 
# $ idate: IDate[1:1], format: NA 
# $ itime:Class 'ITime' int NA 
+0

サブタイミングの方法は、IDimeのために働いていません - IDATE – jf328

+0

@ jf328私はそれをどのように使用しているか、それが "うまくいく"と感じるという例を編集しました。より具体的になりますか?私にとっては、class属性が保持されていれば十分です。 – Frank

+0

'as.ITime(" 00:00:01 ")[NA_integer_]'エラー - data.tableの問題が発生すると思いますか? – jf328