【问题标题】:In R filter rows of one table based off of matches to another table AND date less than other table在 R 过滤器中,一个表的行基于与另一个表的匹配和日期小于另一个表
【发布时间】:2020-06-16 13:37:52
【问题描述】:

我在 R 中有两个类似于以下的表:

df1 拉长日期 1.1 2.3 12-4-70 3.3 7.3 5-5-80 1.1 2.3 7-2-90 df2 拉长日期 1.1 2.3 6-12-82 3.3 2.4 6-10-83 8.4 7.3 8-19-88

我想从 df1 中选择所有在 df2 中有行的行,其中 lat 和 long 都匹配并且 df1 中的日期小于 df2 中的日期。鉴于上面的表格,我想要的输出是:

filtered_df1
lat  long  date
1.1  2.3   12-4-70

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    这称为非等连接。您可以使用fuzzyjoin 包来执行此操作,dplyr:

    library(fuzzyjoin)
    library(lubridate)
    df1 <- df1 %>% mutate(date = mdy(date))
    df2 <- df2 %>% mutate(date = mdy(date))
    
    fuzzy_inner_join(df1, df2, 
                     by = c("lat" = "lat", "long" = "long", "date" = "date"),
                     match_fun = list(`==`,`==`,`<`))
    # A tibble: 1 x 6
      lat.x long.x date.x     lat.y long.y date.y    
      <dbl>  <dbl> <date>     <dbl>  <dbl> <date>    
    1   1.1    2.3 1970-12-04   1.1    2.3 1982-06-12
    

    【讨论】:

      【解决方案2】:

      另一个选项是与data.table 的非等连接

      library(data.table)
      setDT(df1)[, date := as.IDate(date, "%m-%d-%y")
      setDT(df2)[, date := as.IDate(date, "%m-%d-%y")
      df1[df2, on = .(lat, long, date < date)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-21
        • 2023-03-18
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多