第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

dplyr left_join小于,大于條件

dplyr left_join小于,大于條件

慕桂英3389331 2019-10-21 10:43:46
這個(gè)問(wèn)題在某種程度上與以下問(wèn)題有關(guān):在非平凡條件下有效地合并兩個(gè)數(shù)據(jù)框,并檢查r中的日期是否在兩個(gè)日期之間。我在這里發(fā)布的一個(gè)請(qǐng)求功能是否存在: GitHub問(wèn)題我希望使用連接兩個(gè)數(shù)據(jù)框dplyr::left_join()。我用來(lái)加入的條件是小于,大于,即<=和>。是否dplyr::left_join()支持此功能?或僅在鍵=之間使用操作符。從SQL運(yùn)行起來(lái)很簡(jiǎn)單(假設(shè)我在數(shù)據(jù)庫(kù)中有數(shù)據(jù)框)這是一個(gè)MWE:我有兩個(gè)數(shù)據(jù)集,一個(gè)企業(yè)年(fdata),而第二個(gè)是每五年發(fā)生一次的調(diào)查數(shù)據(jù)。因此,對(duì)于fdata兩個(gè)調(diào)查年度之間的所有年份,我都會(huì)加入相應(yīng)的調(diào)查年度數(shù)據(jù)。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可以處理該條件,但是我的語(yǔ)法缺少什么?
查看完整描述

3 回答

?
精慕HU

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊

使用filter。(但是請(qǐng)注意,此答案不能產(chǎn)生正確的答案LEFT JOIN;但是MWE會(huì)給出正確的結(jié)果,INNER JOIN而帶有a 。)


dplyr如果要求合并兩個(gè)表而沒(méi)有要合并的內(nèi)容,則該程序包不滿意,因此在下面,我為此在兩個(gè)表中都創(chuàng)建了一個(gè)啞變量,然后進(jìn)行過(guò)濾,然后刪除dummy:


fdata %>% 

    mutate(dummy=TRUE) %>%

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

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

    select(-dummy)

并注意,如果您在PostgreSQL中進(jìn)行此操作(例如),查詢優(yōu)化器將通過(guò)dummy以下兩個(gè)查詢解釋來(lái)查看該變量:


> 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更干凈地進(jìn)行操作會(huì)得到完全相同的結(jié)果:


> 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)


查看完整回答
反對(duì) 回復(fù) 2019-10-21
?
慕桂英4014372

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊

看起來(lái)這是打包Fuzzyjoin地址的任務(wù)。軟件包的各種功能與dplyr連接功能相似。


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


下面是一個(gè)例子。我使用的功能來(lái)匹配頃>=并<為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

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


查看完整回答
反對(duì) 回復(fù) 2019-10-21
  • 3 回答
  • 0 關(guān)注
  • 1651 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)