对于您上面的示例,我认为您想要ev[ev$date2 %in% df$date1 , ]。
我用新数据创建了另一个示例,因此日期与行号完全不同。
date1 <- 10:18
ret <- c(1.2,2.2,-0.5,0.98,0.73,-1.3,-0.02,0.3,1.1)
df <- data.frame(date1,ret)
date2 <- c(10:13,20,17)
q <- c(3,2,1,4,5,7)
ev <- data.frame(date2,q)
查看要匹配的向量
df$date1
#[1] 10 11 12 13 14 15 16 17 18
ev$date2
# [1] 10 11 12 13 20 17
# So all but one of ev$date2 are in df$date1 (ie. ev$date2 = 20)
匹配日期值
首先看%in%操作数。
这会产生一个 " 逻辑向量,指示是否存在匹配
或不是它的左操作数”(来自?match)。即下面的例子 -
ev$date2 是否出现在 df$date1: TRUE or FALSE
ev$date2 %in% df$date1
# [1] TRUE TRUE TRUE TRUE FALSE TRUE
我会使用这种方法来对数据进行子集化:如果我们只想保留
ev$date2 出现在 df$date1 中的 ev 行使用
ev[ev$date2 %in% df$date1 , ]
# date2 q
# 1 10 3
# 2 11 2
# 3 12 1
# 4 13 4
# 6 17 7
match "返回(第一个)匹配位置的向量
它的第二个参数中的第一个参数”(再次来自帮助)。例如 -
ev$date2 的值在哪里(在什么位置索引处)出现在 df$date1 中,
如果有的话
match(ev$date2 , df$date1)
# [1] 1 2 3 4 NA 8
# Sp that makes sense: all values of ev$date2 are found in df$date1
# (with their position in df$date1 returned) except where ev$date2 = 20 - this
# returns NA as it is not found in df$date1
我会使用这种方法从 df 中提取值,匹配日期。即
(ev$ret <- df$ret[match(ev$date2 , df$date1) ])
#date2 q ret
#1 10 3 1.20
#2 11 2 2.20
#3 12 1 -0.50
#4 13 4 0.98
#5 20 5 NA
#6 17 7 0.30