【问题标题】:Filtering data frame by multiple columns from another data frame从另一个数据框中按多列过滤数据框
【发布时间】:2021-09-09 15:41:32
【问题描述】:

我有两个数据框,我正在尝试使用另一列中的两列过滤掉其中一个数据框。在我的示例中,我尝试使用 df2 数据框通过 df 中的 yearID 列过滤掉数据。例如:

我想从数据框df 中过滤掉所有在 2010 年具有 ID 1、在 2012 年具有 ID 3、在 2010 年具有 ID 2 和在 2013 年具有 ID 4 的日期。因此,在一个新的数据框中,输出中只有 ID 1 的日期为 2010 年,ID 3 的日期为 2012 年,ID 2 的日期为 2010 年,ID 4 的日期为 2013 年。


library(lubridate)
date <- rep_len(seq(dmy("26-12-2010"), dmy("20-12-2013"), by = "days"), 500)
ID <- rep(seq(1, 5), 100)

df <- data.frame(date = date,
                 x = runif(length(date), min = 60000, max = 80000),
                 y = runif(length(date), min = 800000, max = 900000),
                 ID)

df2 <- data.frame(year = c(2010, 2012, 2010,2013),
                  ID = c(1,3,2,4))

【问题讨论】:

    标签: r filter dplyr tidyverse


    【解决方案1】:

    使用基数 R 的另一种方法是使用 merge

    library(lubridate)
    df$year = lubridate::year(df$date)
    
    merge(df, df2)
    

    由于df2 只有两列,因此合并仅限于使用这些列。如果我们要写出我们想要合并的列,那么它看起来像这样。

    merge(df,df2[c("year","ID")],by=c("year","ID"))
    

    【讨论】:

      【解决方案2】:

      这是你需要的吗?

      也许不是最优雅的解决方案,但您可以将年份和 ID 的组合粘贴到两个 data.frames 中,然后使用其中一个过滤另一个。如果你有一个大的data.frame,可能不是最好的方法。

      df %>% 
          dplyr::filter(paste0(lubridate::year(date), "_", ID) %in% paste0(df2$year,"_", df2$ID))
      
      
               date        x        y ID
      1  2010-12-26 74119.46 839347.8  1
      2  2010-12-27 72401.02 891788.1  2
      3  2010-12-31 66940.94 810089.6  1
      4  2012-01-02 68214.97 881200.1  3
      5  2012-01-07 70595.92 863277.7  3
      6  2012-01-12 79799.85 857738.5  3
      7  2012-01-17 61102.50 848880.6  3
      8  2012-01-22 71798.29 883455.7  3
      9  2012-01-27 61550.93 889447.7  3
      10 2012-02-01 69863.50 838101.4  3
      11 2012-02-06 71202.38 873705.6  3
      12 2012-02-11 60124.56 828661.6  3
      13 2012-02-16 65963.74 824347.5  3
      14 2012-02-21 79347.69 818929.1  3
      15 2012-02-26 68082.87 879863.1  3
      16 2012-03-02 68661.00 891477.0  3
      17 2012-03-07 71369.69 849595.6  3
      18 2012-03-12 73265.85 834035.4  3
      19 2012-03-17 70777.06 833344.5  3
      20 2012-03-22 72104.04 881329.5  3
      21 2012-03-27 75471.59 848650.2  3
      22 2012-04-01 77590.13 867834.6  3
      23 2012-04-06 75664.27 828857.6  3
      24 2012-04-11 65789.62 814059.0  3
      25 2012-04-16 72841.91 893683.3  3
      26 2012-04-21 61047.06 805820.7  3
      27 2012-04-26 77232.51 896022.5  3
      28 2012-05-01 77553.05 817557.6  3
      29 2012-05-06 75597.76 899616.4  3
      

      也许更有效的方法是使用连接:

      df$year = lubridate::year(df$date)
      dplyr::left_join(df2, df, by=c("ID", "year")) %>% na.omit()
      

      【讨论】:

        猜你喜欢
        • 2018-03-08
        • 2019-12-21
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        • 2021-08-16
        • 2020-11-16
        • 2016-10-02
        • 2018-11-12
        相关资源
        最近更新 更多