基于类型列表列中的值的子集data.table

时间:2019-12-05 15:19:09

标签: r list data.table subset

因此,我目前这种情况是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

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

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

编辑:这是一个可复制的示例

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

玩得开心!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

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

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