【问题标题】:Subset data.table based on value in column of type list根据类型列表列中的值子集 data.table
【发布时间】:2020-03-30 13:34:08
【问题描述】:

所以我目前有一个 data.table 的案例,其中有一列类型为 list。 此列表可以包含不同的值,NULL 以及其他可能的值。 我尝试对 data.table 进行子集化,以仅保留该列的值为 NULL 的行。

看……我在下面的尝试(例如,我将列命名为“ColofTypeList”):

DT[is.null(ColofTypeList)]

它返回给我一个Empty data.table
然后我尝试了:

DT[ColofTypeList == NULL] 

它返回以下错误(我预计会出现错误):

Error in .prepareFastSubset(isub = isub, x = x, enclos = parent.frame(),  : 
  RHS of == is length 0 which is not 1 or nrow (96). For robustness, no recycling is allowed (other than of length 1 RHS). Consider %in% instead.

(只是一个精度,我的原始 data.table 包含 96 行,这就是错误消息说这样的话的原因:

不是 1 或 nrow (96)。

行数不是重点)。
然后我尝试了这个:

DT[ColofTypeList == list(NULL)]

它返回以下错误:

Error: comparison of these types is not implemented

我还尝试提供与列长度相同长度的列表,并得到同样的最后一个错误。

所以我的问题很简单:什么是正确的 data.table 方法来子集此“ColofTypeList”的元素为NULL 的行?

编辑:这是一个可重现的例子

DT<-data.table(Random_stuff=c(1:9),ColofTypeList=rep(list(NULL,"hello",NULL),3))

玩得开心!

【问题讨论】:

  • 请展示一个可重现的小例子

标签: r list data.table subset


【解决方案1】:

如果是list,我们可以遍历列表并应用is.null返回一个逻辑vector

DT[unlist(lapply(ColofTypeList, is.null))]
#   ColofTypeList anotherCol
#1:                        3

或者另一个选项是lengths

DT[lengths(ColofTypeList)==0]

数据

DT <- data.table(ColofTypeList = list(0, 1:5, NULL, NA), anotherCol = 1:4)

【讨论】:

  • 是的,我也这样做了。然后 ?一旦你对某些元素有 TRUE,我应该怎么做?
  • @YoannPageaud 我正要问这个问题。你的预期输出是什么?是不是对数据行进行子集化,然后DT[DT[, unlist(lapply(ColofTypeList, is.null))]]
  • 预期的输出是得到一个 data.table ,其中包含该列表类型列包含 NULL 元素的所有行。
  • 刚刚看到你更新的答案:我同意这行得通,但它是当前的 data.table 方式吗?
  • @YoannPageaud 是的,lapplydata.table 中有效
【解决方案2】:

我发现了另一种也不错的方法:

DT[lapply(ColofTypeList, is.null)==TRUE]

同样重要的是要提到使用isTRUE() 不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多