问了question之后,我意识到Stackoverflow上没有太多内容可以回答其他特定情况(不仅是基于列表列的NULL
元素对行进行子集化。)
这是一个虚拟数据表,可以用作示例:
DT<-data.table(Random_stuff=c(1:12),ColofTypeList=rep(list(NULL,"hello",5,NA),3))
此示例包含NULL,NA,整数和字符。
所以问题是,当这些值位于类型列表的列中时,如何根据不同类型的值对data.table进行子集设置?
答案 0 :(得分:0)
这是一个答案,它不是详尽无遗的,当然也不是唯一可能的答案,它显示了如何对类型列表列中每种值的类型从data.table中的行进行子集化。
在'ColofTypeList'中包含NULL的子集DT行:
DT[lapply(ColofTypeList, is.null)==TRUE]
在“ ColofTypeList”中包含DT的子集DT行的子集:
DT[lapply(ColofTypeList, is.na)==TRUE]
在'ColofTypeList'中包含字符'hello'的DT行子集:
DT[lapply(ColofTypeList, grepl, pattern="hello")==TRUE]
在'ColofTypeList'中包含整数5的子集DT行:
DT[lapply(ColofTypeList, match,5)==1]
因此,在所有这些情况下,每次键都是直接在类型列表的列上使用lapply()
。
前三个案例返回一个logical
(布尔值),而最后一个案例和第四个案例使用match()
会计算您要查找的值的出现。这就是我写==1
的原因。
我发现这种用于子集行的书写方式非常优雅和简单。
同样,我可能会错过根据类型列表列的内容对data.table的行进行子集设置的其他地方已经记录的内容,但是在这些情况下我发现的并不多。
因此,我希望这对面临此问题的人有用。
如果您已经不得不处理此问题,请看看您的解决方案,看看是否有更简单的方法。
答案 1 :(得分:0)
如何创建可以轻松子集化的新列?
DT<-data.table(Random_stuff=c(1:12),ColofTypeList=rep(list(NULL,"hello",5,NA),3))
DT[, type := sapply(ColofTypeList, typeof)]
可让您按以下方式子集...
DT[type=="character"]
Random_stuff ColofTypeList type
1: 2 hello character
2: 6 hello character
3: 10 hello character
DT[type=="logical"]
Random_stuff ColofTypeList type
1: 4 NA logical
2: 8 NA logical
3: 12 NA logical
DT[type=="NULL"]
Random_stuff ColofTypeList type
1: 1 NULL
2: 5 NULL
3: 9 NULL
DT[type=="double"]
Random_stuff ColofTypeList type
1: 3 5 double
2: 7 5 double
3: 11 5 double