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

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

為什么data.tables的X [Y]聯接不允許完全外部聯接或左聯接?

為什么data.tables的X [Y]聯接不允許完全外部聯接或左聯接?

守著星空守著你 2019-12-06 11:06:05
這是關于data.table連接語法的一個哲學問題。我發現data.tables有越來越多的用途,但仍在學習...X[Y]data.tables的聯接格式非常簡潔,方便且有效,但是據我所知,它僅支持內部聯接和正確的外部聯接。要獲得左側或完全外部聯接,我需要使用merge:X[Y, nomatch = NA] -Y中的所有行-右外部聯接(默認)X[Y, nomatch = 0] -僅X和Y都匹配的行-內部聯接merge(X, Y, all = TRUE) -X和Y的所有行-完全外部聯接merge(X, Y, all.x = TRUE) -X中的所有行-左外部聯接在我看來,如果X[Y]連接格式支持所有4種連接類型,那將很方便。是否僅支持兩種類型的聯接?對我來說,nomatch = 0和nomatch = NA參數值對于正在執行的動作不是很直觀。這是我更容易理解和記憶的merge語法:all = TRUE,all.x = TRUE和all.y = TRUE。由于X[Y]操作merge遠不止于match,因此為什么不對merge聯接使用語法而不是match函數的nomatch參數呢?以下是4種連接類型的代碼示例:# sample X and Y data.tableslibrary(data.table)X <- data.table(t = 1:4, a = (1:4)^2)setkey(X, t)X#    t  a# 1: 1  1# 2: 2  4# 3: 3  9# 4: 4 16Y <- data.table(t = 3:6, b = (3:6)^2)setkey(Y, t)Y#    t  b# 1: 3  9# 2: 4 16# 3: 5 25# 4: 6 36# all rows from Y - right outer joinX[Y]  # default#  t  a  b# 1: 3  9  9# 2: 4 16 16# 3: 5 NA 25# 4: 6 NA 36X[Y, nomatch = NA]  # same as above#    t  a  b# 1: 3  9  9# 2: 4 16 16# 3: 5 NA 25# 4: 6 NA 36merge(X, Y, by = "t", all.y = TRUE)  # same as above#    t  a  b# 1: 3  9  9# 2: 4 16 16# 3: 5 NA 25# 4: 6 NA 36identical(X[Y], merge(X, Y, by = "t", all.y = TRUE))# [1] TRUE# only rows in both X and Y - inner joinX[Y, nomatch = 0]  #    t  a  b# 1: 3  9  9# 2: 4 16 16merge(X, Y, by = "t")  # same as above#    t  a  b# 1: 3  9  9# 2: 4 16 16merge(X, Y, by = "t", all = FALSE)  # same as above#    t  a  b# 1: 3  9  9# 2: 4 16 16identical( X[Y, nomatch = 0], merge(X, Y, by = "t", all = FALSE) )# [1] TRUE# all rows from X - left outer joinmerge(X, Y, by = "t", all.x = TRUE)#    t  a  b# 1: 1  1 NA# 2: 2  4 NA# 3: 3  9  9# 4: 4 16 16# all rows from both X and Y - full outer joinmerge(X, Y, by = "t", all = TRUE)#    t  a  b# 1: 1  1 NA# 2: 2  4 NA# 3: 3  9  9# 4: 4 16 16# 5: 5 NA 25# 6: 6 NA 36更新:data.table v1.9.6引入了on=語法,該語法允許臨時連接除主鍵以外的其他字段。jangorecki對問題的答案如何連接(合并)數據框(內部,外部,左側,右側)?提供了data.table可以處理的其他聯接類型的一些示例。
查看完整描述

3 回答

?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

引用data.table FAQ 1.11 X[Y]和之間有什么區別merge(X, Y)?


X[Y] 是聯接,使用Y(或Y的鍵,如果有的話)作為索引查找X的行。


Y[X] 是一個聯接,使用X(或X的鍵,如果有的話)查找Y的行


merge(X,Y)同時執行兩種方式。X[Y]和的行數Y[X]通常不同,而merge(X,Y)和返回的行數merge(Y,X)相同。


但是錯過了要點。大多數任務需要在連接或合并后對數據執行某些操作。為什么合并所有數據列,然后只使用它們的一小部分?您可能會建議  merge(X[,ColsNeeded1],Y[,ColsNeeded2]),但這要求程序員確定需要哪些列。X[Y,jdata.table中的]為您完成所有這些工作。在編寫時X[Y,sum(foo*bar)],data.table會自動檢查j表達式以查看其使用的列。它只會將這些列作為子集;其他被忽略。僅為j使用的列創建內存,并且Y列在每個組的上下文中均享受標準的R回收規則。假設fooin中X,bar在中Y(以及中的20個其他列Y)。是不是X[Y,sum(foo*bar)] 比合并所有浪費的子集更快地編寫程序和更快地運行?


如果您想要左外連接 X[Y]


le <- Y[X]

mallx <- merge(X, Y, all.x = T)

# the column order is different so change to be the same as `merge`

setcolorder(le, names(mallx))

identical(le, mallx)

# [1] TRUE

如果要完全外部聯接


# the unique values for the keys over both data sets

unique_keys <- unique(c(X[,t], Y[,t]))

Y[X[J(unique_keys)]]

##   t  b  a

## 1: 1 NA  1

## 2: 2 NA  4

## 3: 3  9  9

## 4: 4 16 16

## 5: 5 25 NA

## 6: 6 36 NA


# The following will give the same with the column order X,Y

X[Y[J(unique_keys)]]



查看完整回答
反對 回復 2019-12-07
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

作為MNEL說,左/右外連接是通過交換獲得Y和X:Y[X]航班嗎X[Y]。因此,該語法支持4種連接類型中的3種,而不是2種iiuc。


添加第四似乎是個好主意。假設我們添加full=TRUE或both=TRUE或merge=TRUE(不確定最佳的參數名稱?),那么X[Y,j,merge=TRUE]在FAQ 1.12中BUT之后的原因對我來說是沒有用的。現在已添加了新功能請求,并已鏈接回這里,謝謝:


FR#2301:像merge()一樣,為X [Y]和Y [X]聯接添加merge = TRUE參數。


最近的版本已經加快了速度merge.data.table(例如,通過在內部進行淺表復制來更有效地設置密鑰)。因此,我們正試圖把merge()和X[Y]密切,并提供給用戶的所有選項充分的靈活性。兩者都有優點和缺點。另一個出色的功能要求是:


FR#2033:將by.x和by.y添加到merge.data.table


如果還有其他人,請讓他們繼續前來。


通過問題的這一部分:


為什么不對聯接使用合并語法,而不是對match函數的nomatch參數使用?


如果你喜歡merge()的語法和它的3個參數all,all.x并且all.y然后就用這個來代替X[Y]。認為它應該涵蓋所有情況。還是您的意思是為什么論點是單一nomatch的[.data.table?如果是這樣的話,這對于FAQ 2.14來說似乎就是自然的方式:“您能進一步解釋一下為什么data.table受到base中A [B]語法的啟發嗎?”。而且,nomatch當前0和僅接受兩個值NA??梢詳U展該值,例如,負值表示某種含義,或者12表示使用第12行的值來填充NA,或者nomatch將來可能是向量,甚至可能是本身data.table。


嗯 怎么會通過,而無需按與合并交互= TRUE?也許我們應該把它交給datatable-help。



查看完整回答
反對 回復 2019-12-07
  • 3 回答
  • 0 關注
  • 550 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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