2016-11-05 36 views
0

我可以通過data.table中的列列過濾具有空列表的行嗎?針對空值的data.table過濾器列表列

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 

即預期的結果是

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

明顯的過濾不起作用

> 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 

我想我或許可以定義一個函數來產生正確的布爾值,但因爲我必須使用一組來實現它的實際工作,所以在過濾器參數中不起作用

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列表列上進行任何過濾嗎?我懷疑答案是否定的,因爲你不能列出清單,但認爲這值得提問。

由於

+0

也許你想'長度(b)'? (注意'''結尾。) – Frank

+0

真棒+完美。添加爲答案,我會接受。 –

+1

對於任何人來說,從'?長度'顯而易見的是,按列表過濾的通用版本將會像'dt [sapply(col,boo_func)]'一樣。 –

回答

3

可以通過與lengths列表列的每個元件的長度進行過濾。例如,

dt[ lengths(b) == 0L ]