简体   繁体   中英

Subset data.table based on value in column of type list

So I have this case currently of a data.table with one column of type list. This list can contain different values, NULL among other possible values. I tried to subset the data.table to keep only rows for which this column has the value NULL .

Behold... my attempts below (for the example I named the column "ColofTypeList"):

DT[is.null(ColofTypeList)]

It returns me an Empty data.table .
Then I tried:

DT[ColofTypeList == NULL] 

It returns the following error (I expected an error):

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.

(Just a precision my original data.table contains 96 rows, which is why the error message say such thing:

which is not 1 or nrow (96).

The number of rows is not the point).
Then I tried this:

DT[ColofTypeList == list(NULL)]

It returns the following error:

Error: comparison of these types is not implemented

I also tried to give a list of the same length than the length of the column, and got this same last error.

So my question is simple: What is the correct data.table way to subset the rows for which elements of this "ColofTypeList" are NULL ?

EDIT: here is a reproducible example

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

Have fun!

If it is a list , we can loop through the list and apply the is.null to return a logical vector

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

Or another option is lengths

DT[lengths(ColofTypeList)==0]

data

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

I have found another way that is also quite nice:

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

It is also important to mention that using isTRUE() doesn't work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM