我在这里做错了什么?约会" 5"是不是在最终的data.frame ..为什么会这样?
date1 <- c(1,2,3,4,5,6,7,8,9)
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(1,2,3,5,6,8)
q <- c(3,2,1,4,5,7)
ev <- data.frame(date2,q)
matched <- ev[which(is.na(match(df[["date1"]], ev[["date2"]])) == F),]
matched
# date2 q
# 1 1 3
# 2 2 2
# 3 3 1
# 5 6 5
# 6 8 7
# NA NA NA
答案 0 :(得分:1)
对于上面的示例,我认为您需要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%
操作数。
这会产生一个&#34;指示是否存在匹配的逻辑向量 或者不是因为它的左操作数&#34; (来自?匹配)。即以下示例 - ev $ date2是否出现在df $ date1中:TRUE或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
&#34;返回(第一)匹配位置的向量
第二个问题的第一个论点是#34; (再次来自帮助)。即为例子 -
其中(如在什么位置索引处)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