2017-11-29 11 views
1

変数のグループに少なくとも1つの値がNULL以外のすべての行をフィルタリングする場合に最適な構文を見つけるための問題が発生しました。変数のグループの値に基づいてdata.tableをフィルタリングする

例は以下の通りです:

> dat <- data.table(a=1:5, b=c(1:3, NA, NA), c=c(NA, 1:3, NA)) 

> cols <- c('b', 'c') 

> dat[!all(is.na(cols)), .SD, with=FALSE] 
Null data.table (0 rows and 0 cols) 

> dat[!is.na(b)|!is.na(c), .SD] 
    a b c 
1: 1 1 NA 
2: 2 2 1 
3: 3 3 2 
4: 4 NA 3 

それは私がそれを行うことができますので、しかし、私は変数のグループを含める方法を見つけることができない作品!is.na(variable1) | !is.na(variable2)として、私は明示的に各変数の名前を言うならば、あなたが見ることができるように1条件のみで、すべてを連結しません。or

答えて

3

あなたはrowSums.SDで次の構文を使用することができます。

dat[dat[, rowSums(!is.na(.SD)) > 0, .SDcols = cols]] 
# a b c 
#1: 1 1 NA 
#2: 2 2 1 
#3: 3 3 2 
#4: 4 NA 3 

内側の部分は次のようになり、論理値を作成:あなたがすることもでき、マイケルによってコメント再

dat[, rowSums(!is.na(.SD)) > 0, .SDcols = cols] 
# [1] TRUE TRUE TRUE TRUE FALSE 

を使用Reduce + lapply

dat[dat[, Reduce("+", lapply(.SD, function(x) !is.na(x))) > 0, .SDcols = cols]] 

しかし、ほとんどの私の使用例では、rowSumsのアプローチは大丈夫で読みやすくなりました。

+2

が機能しますが、大量のデータではマトリックス変換は高価です。 Reduceのアプローチがありますが、私はAFKでテストしています。 do.call( '+'、lapply(.SD、is.na)) ''のようなものも動作する可能性があります。 – MichaelChirico

0

これも可能です。

dat[rowSums(!is.na(dat[, cols, with=FALSE])) > 0,] 
    a b c 
#1: 1 1 NA 
#2: 2 2 1 
#3: 3 3 2 
#4: 4 NA 3 
+1

これはOPの関連する列名のベクトル( "cols") 。 –

+0

指摘してくれてありがとう、私は私の答えを更新しました。 – Santosh

関連する問題