gpt4 book ai didi

r - 根据 "Column"列表的内容对数据帧进行子集化

转载 作者:行者123 更新时间:2023-12-04 05:42:54 25 4
gpt4 key购买 nike

设置

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

例如。 R 对象“d.f”,d.f$ID 是索引向量,d.f$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

我的问题

第 1 期

我想根据“Basket_List”是否包含某些值来创建一个新数据集,它是初始数据集的子集。例如。 d.f 中所有行的子集,使得 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

第二期

我的另一个问题是我将在数百万行(它是事务数据)上运行这个操作,所以我想尽可能地优化它的速度(我现在有一个复杂的 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)

最佳答案

您可以为此使用 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

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

速度方面, sapply 不是最快的,但选择会非常快,因为它是矢量化的。如果您需要更高的速度,请使用 data.table 时间。

关于r - 根据 "Column"列表的内容对数据帧进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16267750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com