我是否可以按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
列表列进行任何过滤吗?我怀疑答案是否定的,因为你可以通过列表键入,但认为值得问。
由于
答案 0 :(得分:3)
您可以使用lengths
按列表列的每个元素的长度进行过滤。例如,
dt[ lengths(b) == 0L ]