89609


Rにおいて、以下のようなdfがあったとします。

AAA 200903  
AAA 201003  
BBB 200903  
BBB 201003

これにleft_joinで以下のdfを右側に結合させ、

AAA 200901 1  
AAA 200902 2  
AAA 201003 3  
AAA 201004 4  
AAA 201005 5  
BBB 200902 6  
BBB 200912 7  
BBB 201011 8

以下の結果を導き出したいのですが、なにか上手い方法はありますでしょうか？

AAA 200903 2  
AAA 201003 3  
BBB 200903 6  
BBB 201003 7

つまりは、最初のdfの2列目の値より小さいもののうち、直近のものだけ結合させたい、という意図です。  
よろしくお願いいたします。


CC BY-SA 4.0
2022-06-20T12:57:23.487
89491
2022-06-26T09:53:12.100
2022-06-24T22:54:49.733
52567
52567
question
r
Rのleft_joinでキーが～未満で一番大きい値になったものをjoinさせる方法


##

最初のデータフレームをdf1  
2番目のデータフレームをdf2  
としたとき、最初のdfの2列目の値より小さいもののうち、直近のものだけを抜き出す方法です。

[code]

    df = left_join(df1, df2, by = c("c11" = "c21")) %>%
         filter(c12 > c22) %>%
         group_by(c11, c12) %>%
         summarise(max = max(c23))
    
[/code]

## 実行結果

実行結果の`AAA 201003 2`は質問にある期待結果3と異なりますが、最初のdfの2列目の値より小さい`AAA 200902
2`の値が正しいと思います。

[code]

    > df1
      c11    c12
    1 AAA 200903
    2 AAA 201003
    3 BBB 200903
    4 BBB 201003
    > df2
      c21    c22 c23
    1 AAA 200901   1
    2 AAA 200902   2
    3 AAA 201003   3
    4 AAA 201004   4
    5 AAA 201005   5
    6 BBB 200902   6
    7 BBB 200912   7
    8 BBB 201011   8
    > df
    # A tibble: 4 × 3
    # Groups:   c11 [2]
      c11      c12   max
      <chr>  <dbl> <dbl>
    1 AAA   200903     2
    2 AAA   201003     2
    3 BBB   200903     6
    4 BBB   201003     7
    
[/code]

## 確認に使用したコード

[code]

    c11 <- c('AAA', 'AAA', 'BBB', 'BBB')
    c12 <- c(200903, 201003, 200903, 201003)
    df1 <- data.frame(c11,c12)
    
    c21 <- c('AAA', 'AAA', 'AAA', 'AAA', 'AAA', 'BBB', 'BBB', 'BBB')
    c22 <- c(200901, 200902, 201003, 201004, 201005, 200902, 200912, 201011)
    c23 <- c(1, 2, 3, 4, 5, 6, 7, 8)
    df2 <- data.frame(c21,c22, c23)
    
    library(tidyverse)
    df = left_join(df1, df2, by = c("c11" = "c21")) %>%
         filter(c12 > c22) %>%
         group_by(c11, c12) %>%
         summarise(max = max(c23))
    
    df1
    df2
    df
    
[/code]


CC BY-SA 4.0
2022-06-26T09:53:12.100
89609
2022-06-26T09:53:12.100
35558
89491
answer