基于"列"列表的内容子集数据帧

Eco*_*tis 4 r list object subset dataframe

建立

我有一个列表矩阵,其中一个"列"是一个列表(我意识到它是一个奇数数据集,但我发现它对其他操作很有用).列表的每个条目都是; (1)空(整数(0)),(2)整数,或(3)整数向量.

例如R对象"df",df $ ID是索引向量,df $ Basket_List列表.

ID <- c(1,2,3,4,5,6,7,8,9)
Basket_List <- list(integer(0),c(123,987),c(123,123),456,
                    c(456,123),456,c(123,987),c(987,123),987)
d.f <- data.frame(ID)
d.f$Basket_List <- Basket_List
Run Code Online (Sandbox Code Playgroud)

我的问题

问题1

我想根据"Basket_List"是否包含某些值来创建一个新数据集,该数据集是初始数据集的子集.例如,df中所有行的子集,使得Bask_list具有"123"或"123"和"987" - 或其他更复杂的条件.

我已尝试过以下各种变化,但无济于事.

d.f2 <- subset(d.f, 123 %in% Basket_List)
d.f2 <- subset(d.f, 123 == any(Basket_List))
d.f2 <- d.f[which(123 %in% d.f$Basket_List,]
# should return the subset, with rows 2,3,5,7 & 8
Run Code Online (Sandbox Code Playgroud)

问题2

我的另一个问题是,我将在数百万行(它的事务数据)上运行此操作,所以我想尽可能地优化速度(我现在有一个复杂的for循环,但它需要太多时间).


替代数据设置

如果您认为它可能有用,则数据也可能设置如下:

ID <- c(1,2,2,3,3,4,5,5,6,7,7,8,8,9)
Basket <- c(NA,123,987,123,123,456,456,123,456,123,987,987,123,987)
alt.d.f <- data.frame(ID,Basket)
Run Code Online (Sandbox Code Playgroud)

Ari*_*man 6

你可以使用sapply这个:

ID <- c(1,2,3,4,5,6,7,8,9)
Basket_List <- list(integer(0),c(123,987),c(123,123),456,
                    c(456,123),456,c(123,987),c(987,123),987)
d.f <- data.frame(ID)

sel <- sapply( Basket_List, function(bl,searchItem) {
  any(searchItem %in% bl)
}, searchItem=c(123) )

> sel
[1] FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE

> d.f[sel,,drop=FALSE]
  ID
2  2
3  3
5  5
7  7
8  8
Run Code Online (Sandbox Code Playgroud)

请注意您的术语.data.frame不是矩阵.这是一种列表.

速度方面,sapply并不是最快的,但选择将非常快,因为它是矢量化的.如果你需要更快的速度,data.table时间.