因此,我目前这种情况是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))
玩得开心!
答案 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()
不起作用。