data.table过滤器列表中的空值

时间:2016-11-05 21:07:48

标签: r filter 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

我认为我可能能够定义一个函数来产生正确的布尔值,但是由于我必须使用group by来使它实际工作,所以它不适用于filter参数

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列表列进行任何过滤吗?我怀疑答案是否定的,因为你可以通过列表键入,但认为值得问。

由于

1 个答案:

答案 0 :(得分:3)

您可以使用lengths按列表列的每个元素的长度进行过滤。例如,

dt[ lengths(b) == 0L ]