You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多列条件筛选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:20:13