如何生成按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
相关产品推荐
相关产品推荐

