【问题标题】:data.table filter list column for empty values空值的 data.table 过滤器列表列
【发布时间】: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


【解决方案1】:

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

dt[ lengths(b) == 0L ]

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2018-05-08
    • 2015-11-18
    • 2011-08-11
    • 2014-08-12
    相关资源
    最近更新 更多