2016-11-05 5 views
0

空のリストを持つ行についてはdata.tableのリスト列でフィルタリングできますか?期待される結果が明らかにフィルタリングがdata.table空の値のフィルタリストの列

> dt[length(b) == 0] 
Empty data.table (0 rows) of 2 cols: a,b 

> dt[length(b[[1]]) == 0] 
Empty data.table (0 rows) of 2 cols: a,b 

動作しない

> dt[filter(b)] 
    a b 
1: 2 

私は右のブール値をもたらすように関数を定義することができるかもしれないと思っている。すなわち

library(data.table) 
dt = data.table(a = c(1, 2, 3), b = list(c("A", "B"), character(0), c("C", "D", "E"))) 

> dt 
a  b 
1: 1 1,2 
2: 2  
3: 3 1,2,3 

しかし、実際に動作させるためにグループを使用する必要があるので、それはフィルタ引数では機能しません。

is_null_list = function(l) is.list(l) & length(l[[1]]) == 0 

> dt[, is_null_list(b), a] 
a V1 
1: 1 FALSE 
2: 2 TRUE 
3: 3 FALSE 

> dt[is_null_list(b)] 
Empty data.table (0 rows) of 2 cols: a,b 

さらに一般的な質問もあると思いますが、data.tableの列をフィルタリングすることはできますか?私はあなたがリストでキー入力することができないので答えはノーだと思うが、それは頼む価値があると思った。あなたはlengthsとリスト列の各要素の長さによってフィルタリングすることができ

おかげ

+0

「length(b)」が必要なのでしょうか? (最後に 's'に注意してください) – Frank

+0

恐ろしい+完璧です。答えとして追加して受け入れます。 –

+1

探している人には、 '?lengths'からリストカラムによるフィルタリングの一般的なバージョンは' dt [sapply(col、boo_func)] 'のようになることが明らかになりました。 –

答えて

3

。たとえば、

dt[ lengths(b) == 0L ] 
関連する問題