【发布时间】:2017-03-19 11:59:49
【问题描述】:
我可以按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 列表列进行任何过滤吗?我怀疑答案是否定的,因为您无法按列表键入,但认为值得一问。
谢谢
【问题讨论】:
-
也许你想要
lengths(b)? (注意末尾的s。) -
真棒+完美。添加为答案,我会接受。
-
对于任何查看的人来说,从
?lengths可以明显看出,按列表列过滤的一般版本类似于dt[sapply(col, boo_func)]。
标签: r filter data.table