non equi join returns 不存在的列名
non equi join returns non existing column names
我无法在 R 中对两个 data.tables 进行基本的非等值连接而不会出现错误:
argument specifying columns specify non existing column(s): cols[2]='abs(x.val - i.val)'
一分钟。显示错误的示例。
library(data.table)
set.seed(1); dt1 <- data.table(id= sample(letters[1:3],size = 10,replace = T),val = rnorm(10,mean = 5,sd = 2))
set.seed(2); dt2 <- data.table(id= sample(letters[1:3],size = 10,replace = T),val = rnorm(10,mean = 5,sd = 2))
dt1[dt2,on = .(id,abs(x.val - i.val) <1),nomatch=0]
#> Error in colnamesInt(x, names(on), check_dups = FALSE): argument specifying columns specify non existing column(s): cols[2]='abs(x.val - i.val)'
由 reprex package (v2.0.1)
创建于 2022-05-17
这一定是我缺少的基本内容。
注意:为了测试 x,我特意让两个数据表中的列名保持相同。和我。 data.table.
的功能
分两步,因为 on
只接受 =
、<
或 >
:
dt1[dt2,on = .(id),nomatch=0,allow.cartesian=T][abs(val - i.val)<1]
id val i.val
1: a 3.142866 3.175512
2: b 4.421077 3.494669
3: b 4.401570 3.494669
4: a 4.988466 4.428577
5: a 3.142866 2.931430
6: a 4.988466 4.943710
7: a 4.988466 4.267357
8: a 3.142866 2.769503
或者避免笛卡尔积:
dt2[,`:=`(val_min=val-1,val_max=val+1)]
dt1[dt2,.(id,x.val,i.val),on = .(id,val>val_min,val<val_max),nomatch=0]
id x.val i.val
1: a 3.142866 3.175512
2: b 4.421077 3.494669
3: b 4.401570 3.494669
4: a 4.988466 4.428577
5: a 3.142866 2.931430
6: a 4.988466 4.943710
7: a 4.988466 4.267357
8: a 3.142866 2.769503
我无法在 R 中对两个 data.tables 进行基本的非等值连接而不会出现错误:
argument specifying columns specify non existing column(s): cols[2]='abs(x.val - i.val)'
一分钟。显示错误的示例。
library(data.table)
set.seed(1); dt1 <- data.table(id= sample(letters[1:3],size = 10,replace = T),val = rnorm(10,mean = 5,sd = 2))
set.seed(2); dt2 <- data.table(id= sample(letters[1:3],size = 10,replace = T),val = rnorm(10,mean = 5,sd = 2))
dt1[dt2,on = .(id,abs(x.val - i.val) <1),nomatch=0]
#> Error in colnamesInt(x, names(on), check_dups = FALSE): argument specifying columns specify non existing column(s): cols[2]='abs(x.val - i.val)'
由 reprex package (v2.0.1)
创建于 2022-05-17这一定是我缺少的基本内容。
注意:为了测试 x,我特意让两个数据表中的列名保持相同。和我。 data.table.
的功能分两步,因为 on
只接受 =
、<
或 >
:
dt1[dt2,on = .(id),nomatch=0,allow.cartesian=T][abs(val - i.val)<1]
id val i.val
1: a 3.142866 3.175512
2: b 4.421077 3.494669
3: b 4.401570 3.494669
4: a 4.988466 4.428577
5: a 3.142866 2.931430
6: a 4.988466 4.943710
7: a 4.988466 4.267357
8: a 3.142866 2.769503
或者避免笛卡尔积:
dt2[,`:=`(val_min=val-1,val_max=val+1)]
dt1[dt2,.(id,x.val,i.val),on = .(id,val>val_min,val<val_max),nomatch=0]
id x.val i.val
1: a 3.142866 3.175512
2: b 4.421077 3.494669
3: b 4.401570 3.494669
4: a 4.988466 4.428577
5: a 3.142866 2.931430
6: a 4.988466 4.943710
7: a 4.988466 4.267357
8: a 3.142866 2.769503