基于多列条件筛选dataframe的行子集
高效筛选data.table中同时包含put和call的Tickers-Strike组合
针对你用data.table筛选同时包含put和call的Tickers-Strike组合的需求,这里有两个高效且精准的解决方案,完全符合你的要求:
方案一:直接分组筛选(简洁直观)
利用data.table原生的分组特性,直接在分组时校验类型条件,逻辑清晰且性能优异:
library(data.table) # 你的原始数据 x <- data.table(Tickers=c("A","A","A","B","B","B","B","D","D","D","D"), Type=c("put","call","put","call","call","put","call","put","call","put","call"), Strike=c(35,37.5,37.5,10,11,11,12,40,40,42,42), Other=sample(20,11)) # 核心筛选代码 result <- x[, if (all(c("put", "call") %in% Type)) .SD, by = .(Tickers, Strike)]
代码解释:
by = .(Tickers, Strike):按股票代码+行权价的组合进行分组,这正是我们需要关注的核心维度if (all(c("put", "call") %in% Type)):检查当前分组内是否同时包含put和call两种期权类型.SD:代表当前分组的所有行,只有当条件满足时才保留这些行
方案二:先筛选有效组合再匹配(大数据集更高效)
如果你的数据集非常大,先提取符合条件的(Tickers, Strike)组合,再通过连接筛选原数据,性能可能更优:
# 第一步:获取同时包含put和call的有效组合 valid_pairs <- x[, .(has_put = "put" %in% Type, has_call = "call" %in% Type), by = .(Tickers, Strike)][has_put & has_call, .(Tickers, Strike)] # 第二步:用有效组合筛选原数据 result <- x[valid_pairs, on = .(Tickers, Strike)]
代码解释:
- 第一步先分组计算每个组合是否存在put和call,筛选出同时满足的组合列表
- 第二步利用data.table的
on参数做等值连接,快速匹配原数据中符合条件的行,避免对所有分组的行进行遍历处理
为什么比你之前的方法更好?
你之前尝试的生成id列筛选重复项的方法,只能确保Tickers-Strike组合重复,但无法保证这些组合同时包含put和call(比如某个组合全是call也会被误保留)。而上面的两种方法直接在分组逻辑中加入了类型校验,逻辑更精准;同时data.table的分组和连接操作都是底层优化过的,处理大数据集时的效率远高于手动生成id的方法。
运行任意一种方案后,你都会得到期望的结果:
Tickers Type Strike Other 1: A call 37.5 5 2: A put 37.5 13 3: B call 11.0 12 4: B put 11.0 4 5: D put 40.0 7 6: D call 40.0 11 7: D put 42.0 10 8: D call 42.0 1
内容的提问来源于stack exchange,提问作者road_to_quantdom
相关产品推荐
相关产品推荐

