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

时间:2019-12-05 17:13:07

标签: r list data.table

问了question之后,我意识到Stackoverflow上没有太多内容可以回答其他特定情况(不仅是基于列表列的NULL元素对行进行子集化。)

这是一个虚拟数据表,可以用作示例:

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

此示例包含NULL,NA,整数和字符。

所以问题是,当这些值位于类型列表的列中时,如何根据不同类型的值对data.table进行子集设置?

2 个答案:

答案 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