亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

dplyr left_join小于,大于條件

dplyr left_join小于,大于條件

慕桂英3389331 2019-10-21 10:43:46
這個問題在某種程度上與以下問題有關:在非平凡條件下有效地合并兩個數據框,并檢查r中的日期是否在兩個日期之間。我在這里發布的一個請求功能是否存在: GitHub問題我希望使用連接兩個數據框dplyr::left_join()。我用來加入的條件是小于,大于,即<=和>。是否dplyr::left_join()支持此功能?或僅在鍵=之間使用操作符。從SQL運行起來很簡單(假設我在數據庫中有數據框)這是一個MWE:我有兩個數據集,一個企業年(fdata),而第二個是每五年發生一次的調查數據。因此,對于fdata兩個調查年度之間的所有年份,我都會加入相應的調查年度數據。id <- c(1,1,1,1,        2,2,2,2,2,2,        3,3,3,3,3,3,        5,5,5,5,        8,8,8,8,        13,13,13)fyear <- c(1998,1999,2000,2001,1998,1999,2000,2001,2002,2003,       1998,1999,2000,2001,2002,2003,1998,1999,2000,2001,       1998,1999,2000,2001,1998,1999,2000)byear <- c(1990,1995,2000,2005)eyear <- c(1995,2000,2005,2010)val <- c(3,1,5,6)sdata <- tbl_df(data.frame(byear, eyear, val))fdata <- tbl_df(data.frame(id, fyear))test1 <- left_join(fdata, sdata, by = c("fyear" >= "byear","fyear" < "eyear"))我懂了Error: cannot join on columns 'TRUE' x 'TRUE': index out of bounds 除非是否left_join可以處理該條件,但是我的語法缺少什么?
查看完整描述

3 回答

?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

使用filter。(但是請注意,此答案不能產生正確的答案LEFT JOIN;但是MWE會給出正確的結果,INNER JOIN而帶有a 。)


dplyr如果要求合并兩個表而沒有要合并的內容,則該程序包不滿意,因此在下面,我為此在兩個表中都創建了一個啞變量,然后進行過濾,然后刪除dummy:


fdata %>% 

    mutate(dummy=TRUE) %>%

    left_join(sdata %>% mutate(dummy=TRUE)) %>%

    filter(fyear >= byear, fyear < eyear) %>%

    select(-dummy)

并注意,如果您在PostgreSQL中進行此操作(例如),查詢優化器將通過dummy以下兩個查詢解釋來查看該變量:


> fdata %>% 

+     mutate(dummy=TRUE) %>%

+     left_join(sdata %>% mutate(dummy=TRUE)) %>%

+     filter(fyear >= byear, fyear < eyear) %>%

+     select(-dummy) %>%

+     explain()

Joining by: "dummy"

<SQL>

SELECT "id" AS "id", "fyear" AS "fyear", "byear" AS "byear", "eyear" AS "eyear", "val" AS "val"

FROM (SELECT * FROM (SELECT "id", "fyear", TRUE AS "dummy"

FROM "fdata") AS "zzz136"


LEFT JOIN 


(SELECT "byear", "eyear", "val", TRUE AS "dummy"

FROM "sdata") AS "zzz137"


USING ("dummy")) AS "zzz138"

WHERE "fyear" >= "byear" AND "fyear" < "eyear"



<PLAN>

Nested Loop  (cost=0.00..50886.88 rows=322722 width=40)

  Join Filter: ((fdata.fyear >= sdata.byear) AND (fdata.fyear < sdata.eyear))

  ->  Seq Scan on fdata  (cost=0.00..28.50 rows=1850 width=16)

  ->  Materialize  (cost=0.00..33.55 rows=1570 width=24)

        ->  Seq Scan on sdata  (cost=0.00..25.70 rows=1570 width=24)

并使用SQL更干凈地進行操作會得到完全相同的結果:


> tbl(pg, sql("

+     SELECT *

+     FROM fdata 

+     LEFT JOIN sdata 

+     ON fyear >= byear AND fyear < eyear")) %>%

+     explain()

<SQL>

SELECT "id", "fyear", "byear", "eyear", "val"

FROM (

    SELECT *

    FROM fdata 

    LEFT JOIN sdata 

    ON fyear >= byear AND fyear < eyear) AS "zzz140"



<PLAN>

Nested Loop Left Join  (cost=0.00..50886.88 rows=322722 width=40)

  Join Filter: ((fdata.fyear >= sdata.byear) AND (fdata.fyear < sdata.eyear))

  ->  Seq Scan on fdata  (cost=0.00..28.50 rows=1850 width=16)

  ->  Materialize  (cost=0.00..33.55 rows=1570 width=24)

        ->  Seq Scan on sdata  (cost=0.00..25.70 rows=1570 width=24)


查看完整回答
反對 回復 2019-10-21
?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

看起來這是打包Fuzzyjoin地址的任務。軟件包的各種功能與dplyr連接功能相似。


在這種情況下,其中一項fuzzy_*_join功能將為您服務。dplyr::left_join和之間的主要區別在于fuzzyjoin::fuzzy_left_join,您提供了在match.fun參數匹配過程中使用的函數列表。請注意,該by參數的寫法仍然與相同left_join。


下面是一個例子。我使用的功能來匹配頃>=并<為fyear到byear和fyear到eyear的比較,分別。的


library(fuzzyjoin)


fuzzy_left_join(fdata, sdata, 

             by = c("fyear" = "byear", "fyear" = "eyear"), 

             match_fun = list(`>=`, `<`))


Source: local data frame [27 x 5]


      id fyear byear eyear   val

   (dbl) (dbl) (dbl) (dbl) (dbl)

1      1  1998  1995  2000     1

2      1  1999  1995  2000     1

3      1  2000  2000  2005     5

4      1  2001  2000  2005     5

5      2  1998  1995  2000     1

6      2  1999  1995  2000     1

7      2  2000  2000  2005     5

8      2  2001  2000  2005     5

9      2  2002  2000  2005     5

10     2  2003  2000  2005     5

..   ...   ...   ...   ...   ...


查看完整回答
反對 回復 2019-10-21
  • 3 回答
  • 0 關注
  • 1653 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號