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

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

data.table連接,然后將列添加到現有的data.frame中,而無需重新復制

data.table連接,然后將列添加到現有的data.frame中,而無需重新復制

海綿寶寶撒 2019-12-04 12:46:42
我有兩個data.tables,X(3m行,約500列)和Y(100行,兩列)。set.seed(1)X <- data.table( a=letters, b=letters, c=letters, g=sample(c(1:5,7),length(letters),replace=TRUE), key="g" )Y <- data.table( z=runif(6), g=1:6, key="g" )我想在X上做一個左外部連接,這Y[X]要歸功于:為什么data.tables的X [Y]聯接不允許完全外部聯接或左聯接?但是我想添加新列X 而不進行復制X(因為它很大)。顯然,類似的東西很X <- Y[X]有效,但除非data.table比我認為它聰明得多(而且我認為它有很多曲折?。?,否則我相信它會復制整個X。X[ , z:= Y[X,z]$z ] 可以,但是很笨拙,無法很好地擴展到不止一列。如何以有效的方式(無論是在副本方面還是在程序員時間方面)將合并結果存儲回保留的data.table中?
查看完整描述

2 回答

?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

這很容易做到:


X[Y, z := i.z]

之所以起作用,是因為Y[X]和之間的唯一區別X[Y]是當某些元素不在in時Y,在這種情況下,您可能想z成為NA,上面的賦值恰好可以做到。


它對于許多變量也同樣適用:


X[Y, `:=`(z1 = i.z1, z2 = i.z2, ...)]

由于您需要進行操作Y[X],因此可以添加參數nomatch=0(如@mnel所指出的),以便對于X不包含Y的鍵值的那些對象不獲取NA。即:


X[Y, z := i.z, nomatch=0]

從NEWS獲取data.table


    **********************************************

    **                                          **

    **   CHANGES IN DATA.TABLE VERSION 1.7.10   **

    **                                          **

    **********************************************

新的功能


o   The prefix i. can now be used in j to refer to join inherited

    columns of i that are otherwise masked by columns in x with

    the same name.


查看完整回答
反對 回復 2019-12-04
?
呼如林

TA貢獻1798條經驗 獲得超3個贊

除了上述答案外,您還可以執行(v1.9.6+):


require(data.table) # v1.9.6+

X[Y, (colNames) := mget(paste0("i.", colNames))]

colNames字符向量在哪里列出您想要的列Y。這樣,當您要添加許多列時,您可以有效地選擇要添加的列(colNames從的子集定義names(Y))。


另外,您可以將其與新on=參數(來自v1.9.6+)組合為:


# ad-hoc joins using 'on=' instead of setting keys

require(data.table) # v1.9.6+

X[Y, (colNames) := mget(paste0("i.", colNames)), on = "g"]

值得在(colNames) := mget(colNames)這里使用akrun的策略:更新R中的數據幀行。


查看完整回答
反對 回復 2019-12-04
  • 2 回答
  • 0 關注
  • 689 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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