2016-11-05 2 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

'lengths (b)'를 원할 수도 있습니다. (끝 부분에's'을 적어 두십시오.) – Frank

+0

굉장 + 완벽. 대답을 추가하면 받아 들일 것입니다. –

+1

누구나 볼 수 있듯이'? lengths'에서리스트 열로 필터링하는 일반 버전은'dt [sapply (col, boo_func)] '와 같은 것을 알 수 있습니다. –

답변

3

당신은 lengths와 목록 컬럼의 각 요소의 길이를 기준으로 필터링 할 수 있습니다. 예 :

dt[ lengths(b) == 0L ]