无法正确匹配data.frames

时间:2014-04-06 07:45:37

标签: r dataframe match

我在这里做错了什么?约会" 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

1 个答案:

答案 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