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

如何生成按data.table A的contract.name排序的B的bid值向量

解决方法:按A的合约顺序提取B中的bid向量

没问题,这事儿用data.table的工具分分钟搞定,我给你两种实用的方法,你看哪种顺手就用哪种:

方法1:用match()函数匹配位置

这种方法直接利用向量匹配的逻辑,先找到A中每个合约名称在B合约列的位置,再提取对应的bid值:

library(data.table)

# 先构造你的示例数据(如果已经有数据可以跳过这部分)
A <- data.table(
  contract.name = c("Q1-2019", "Q2-2019", "Q3-2019", "Q4-2019"),
  contract.start = as.Date(c("2019-01-01", "2019-04-01", "2019-07-01", "2019-10-01")),
  contract.end = as.Date(c("2019-04-01", "2019-07-01", "2019-10-01", "2020-01-01")),
  price = c(10, 12, 11, 13)
)

B <- data.table(
  contract = c("Q2-2018", "Q3-2018", "Q4-2018", "Q1-2019"),
  delivery.begin = as.Date(c("2018-04-01", "2018-07-01", "2018-10-01", "2019-01-01")),
  delivery.end = as.Date(c("2018-06-30", "2018-09-30", "2018-12-31", "2019-03-31")),
  bid = c(9.8, 11.5, 10.5, 12.8),
  ask = c(10.5, 12.1, 11.3, 13.5)
)

# 核心操作:匹配位置并提取bid
bid_vector <- B$bid[match(A$contract.name, B$contract)]
print(bid_vector)

运行后输出:

[1] 12.8   NA   NA   NA

注:因为A里的Q2-2019、Q3-2019、Q4-2019在B中没有对应的合约,所以这些位置返回NA,完全符合需求。

方法2:用data.table的左连接操作

如果你更习惯用data.table的join语法,左连接能更直观地保留A的原有顺序,同时匹配B的bid值:

# 左连接:保留A的所有行,匹配B中对应的bid
result <- A[B, on = .(contract.name = contract), bid := i.bid]

# 提取bid列作为向量
bid_vector <- result$bid
print(bid_vector)

运行后得到和方法1完全一致的结果:

[1] 12.8   NA   NA   NA

两种方法都能满足需求,你可以根据自己的代码风格选择。如果合约名称有重复的情况,match()会取第一个匹配项,而join会返回所有匹配行(这时候你可能需要额外处理去重),不过你的示例数据里合约都是唯一的,所以两种方法效果一样。

内容的提问来源于stack exchange,提问作者L1meta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:41:15