這個問題給出瞭如何在by.x =
和by.y =
參數轉換的基礎R
merge
到data.table
語法,連接鍵指定不同的名稱列的例子:如何使用指定和提取X和Y中的非平衡連接X [Y,...]中的變量?
data.table merge by multiple columns
但是,我不能工作不知道如何爲非等效連接做同樣的事情,而且我對輸出非常困惑。
示例數據:
set.seed(0)
tmp_dt1<- data.table(grp = c(1,2), time = runif(100))
tmp_dt2 <- data.table(grp = c(1,2), time = c(0.1, 0.5))
tmp_dt2 <- tmp_dt2[, time_to := time + 0.2]
tmp_dt2 <- tmp_dt2[, time_from := time] # for clarity, rename time variable
我想通過grp
以相等聯接兩個表,然後由非球菌加盟,使我只保留time
從tmp_dt1
它屬於time_to
和time_from
之間。從我可以告訴tmp_dt1[tmp_dt2, , on = c("grp", "time>=time", "time<=time_to")]
做什麼,我想:
> tmp_dt1[tmp_dt2, , on = c("grp", "time>=time", "time<=time_to")]
grp time time.1 time_from
1: 1 0.1 0.3 0.1
2: 1 0.1 0.3 0.1
3: 1 0.1 0.3 0.1
4: 1 0.1 0.3 0.1
5: 1 0.1 0.3 0.1
6: 1 0.1 0.3 0.1
7: 1 0.1 0.3 0.1
...
什麼讓我困惑的是,x.time
缺失,產生的列名都非常混亂。例如,爲什麼有一列叫做time.1
?我想澄清的語法讓tmp_dt1[tmp_dt2, , on = c("grp", "time>=y.time", "time<=y.time_to")]
生產:
grp y.time y.time_to time_from
1: 1 0.1 0.3 0.1
2: 1 0.1 0.3 0.1
3: 1 0.1 0.3 0.1
4: 1 0.1 0.3 0.1
5: 1 0.1 0.3 0.1
6: 1 0.1 0.3 0.1
7: 1 0.1 0.3 0.1
...
有的怎麼也解列x.time
,除了所有列在y
。不幸的是這個失敗,出現錯誤:
> tmp_dt1[tmp_dt2, , on = c("grp", "time>=y.time", "time<=y.time_to")]
Error in `[.data.table`(tmp_dt1, tmp_dt2, , on = c("grp", "time>=y.time", :
Column(s) [y.time,y.time_to] not found in i
嘗試以下也不會產生我所期望的,而不是我得到:
> tmp_dt1[tmp_dt2, .(grp, time, time_from = i.time, time_to = i.time_to), on = c("grp", "time>=time", "time<=time_to")]
grp time time_from time_to
1: 1 0.1 0.1 0.3
2: 1 0.1 0.1 0.3
3: 1 0.1 0.1 0.3
4: 1 0.1 0.1 0.3
5: 1 0.1 0.1 0.3
6: 1 0.1 0.1 0.3
7: 1 0.1 0.1 0.3
其中time
列不承擔任何相似之處tmp_dt1$time
。
確定,據我所知,如果使用'提供了'on'條件的連接密鑰匹配以下規則適用。()'或'C()'在'X [Y]'中。如果每個元素包含一個變量,則在兩個表中查找該變量。如果變量在方程的任一側提供,則在'X'表中查找LHS變量,在'Y'表中查找RHS變量。變量提取和最終列名對我來說仍然是一個謎。 – Alex
最後的列名始終來自Y.每個條目在'on ='中有一個連接列。 – Frank
您可能想澄清預期的結果。這是一個相當合理的事情:'tmp_dt1 [tmp_dt1 [tmp_dt2,on =。(grp,time> = time_from,time <= time_to),which = TRUE]]'將第一個表格子集化。我懷疑作爲重複的價值觀掛在下限和上限上是否有很多意義。 – Frank