【问题标题】:Can't match data.frames correctly无法正确匹配 data.frames
【发布时间】:2014-04-06 07:45:37
【问题描述】:

我在这里做错了什么?日期“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

【问题讨论】:

    标签: r dataframe match


    【解决方案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%操作数。

    这会产生一个 " 逻辑向量,指示是否存在匹配 或不是它的左操作数”(来自?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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多