如何在 data.table 版本 1.14.3 中使用 `env` 参数
How to use the `env` parameter in data.table version 1.14.3
我正在尝试了解 data.table 中的新 env
参数。
这有效(data.table 版本 1.14.3)
df1 = data.table(x=seq(1,10))
a="x"
df1[a<5, env=list(a=a)]
x
1: 1
2: 2
3: 3
4: 4
但是,我无法让它在连接条件下工作
df1 = data.table(x=seq(1,10), xz=rnorm(10))
df2 = data.table(y=seq(5,14), yz=rnorm(10))
a="x"
b="y"
# This fails
df1[df2, on=.(a<b), nomatch=0, env=list(a=a,b=b)]
关于如何将变量 a
和 b
传递给 data.table 的 on
子句有什么想法吗?我了解如何通过功能来做到这一点。但是,我正在努力寻找将 a
和 b
作为字符传递的最佳方法,并且仍然在 on
子句中使用
# This works
func <- function(d1,d2,a,b) {
eval(substitute(d1[d2, on=.(a<b), nomatch=0]))
}
func(df1,df2,x,y)
根据 ?data.table
(1.14.3
)
的文档
env - List or an environment, passed to substitute2 for substitution of parameters in i, j and by (or keyby)
. Use verbose to preview constructed expressions.
未指定 env
与 on
的用法。没有 eval/substitute
的选项是在 on
中传递 named
向量
out1 <- df1[df2, on = setNames(b, a), nomatch = 0]
-检查实际列的输出
> out2 <- df1[df2, on = .(x = y), nomatch = 0]
> identical(out1, out2)
[1] TRUE
对于 non-equi 加入,正如@jangorecki 在评论中提到的,使用 substitute2
eval(substitute2(df1[df2, on = .(a <b), nomatch = 0], env = list(a=a, b = b)))
-输出
x xz yz
<int> <num> <num>
1: 5 -1.1259516 -0.78272556
2: 5 -0.4893074 -0.78272556
3: 5 1.8534867 -0.78272556
4: 5 -0.0376076 -0.78272556
5: 6 -1.1259516 -0.38678402
6: 6 -0.4893074 -0.38678402
7: 6 1.8534867 -0.38678402
8: 6 -0.0376076 -0.38678402
9: 6 -0.8409438 -0.38678402
10: 7 -1.1259516 1.18356550
11: 7 -0.4893074 1.18356550
12: 7 1.8534867 1.18356550
13: 7 -0.0376076 1.18356550
14: 7 -0.8409438 1.18356550
15: 7 2.4536938 1.18356550
16: 8 -1.1259516 1.01226735
17: 8 -0.4893074 1.01226735
18: 8 1.8534867 1.01226735
19: 8 -0.0376076 1.01226735
20: 8 -0.8409438 1.01226735
21: 8 2.4536938 1.01226735
22: 8 -0.4296828 1.01226735
23: 9 -1.1259516 0.64996351
24: 9 -0.4893074 0.64996351
25: 9 1.8534867 0.64996351
26: 9 -0.0376076 0.64996351
27: 9 -0.8409438 0.64996351
28: 9 2.4536938 0.64996351
29: 9 -0.4296828 0.64996351
30: 9 0.9030399 0.64996351
31: 10 -1.1259516 -1.23172125
32: 10 -0.4893074 -1.23172125
33: 10 1.8534867 -1.23172125
34: 10 -0.0376076 -1.23172125
35: 10 -0.8409438 -1.23172125
36: 10 2.4536938 -1.23172125
37: 10 -0.4296828 -1.23172125
38: 10 0.9030399 -1.23172125
39: 10 0.5757248 -1.23172125
40: 11 -1.1259516 0.21203485
41: 11 -0.4893074 0.21203485
42: 11 1.8534867 0.21203485
43: 11 -0.0376076 0.21203485
44: 11 -0.8409438 0.21203485
45: 11 2.4536938 0.21203485
46: 11 -0.4296828 0.21203485
47: 11 0.9030399 0.21203485
48: 11 0.5757248 0.21203485
49: 11 -1.1732665 0.21203485
50: 12 -1.1259516 -1.28178320
51: 12 -0.4893074 -1.28178320
52: 12 1.8534867 -1.28178320
53: 12 -0.0376076 -1.28178320
54: 12 -0.8409438 -1.28178320
55: 12 2.4536938 -1.28178320
56: 12 -0.4296828 -1.28178320
57: 12 0.9030399 -1.28178320
58: 12 0.5757248 -1.28178320
59: 12 -1.1732665 -1.28178320
60: 13 -1.1259516 -0.03909294
61: 13 -0.4893074 -0.03909294
62: 13 1.8534867 -0.03909294
63: 13 -0.0376076 -0.03909294
64: 13 -0.8409438 -0.03909294
65: 13 2.4536938 -0.03909294
66: 13 -0.4296828 -0.03909294
67: 13 0.9030399 -0.03909294
68: 13 0.5757248 -0.03909294
69: 13 -1.1732665 -0.03909294
70: 14 -1.1259516 0.25522954
71: 14 -0.4893074 0.25522954
72: 14 1.8534867 0.25522954
73: 14 -0.0376076 0.25522954
74: 14 -0.8409438 0.25522954
75: 14 2.4536938 0.25522954
76: 14 -0.4296828 0.25522954
77: 14 0.9030399 0.25522954
78: 14 0.5757248 0.25522954
79: 14 -1.1732665 0.25522954
我正在尝试了解 data.table 中的新 env
参数。
这有效(data.table 版本 1.14.3)
df1 = data.table(x=seq(1,10))
a="x"
df1[a<5, env=list(a=a)]
x
1: 1
2: 2
3: 3
4: 4
但是,我无法让它在连接条件下工作
df1 = data.table(x=seq(1,10), xz=rnorm(10))
df2 = data.table(y=seq(5,14), yz=rnorm(10))
a="x"
b="y"
# This fails
df1[df2, on=.(a<b), nomatch=0, env=list(a=a,b=b)]
关于如何将变量 a
和 b
传递给 data.table 的 on
子句有什么想法吗?我了解如何通过功能来做到这一点。但是,我正在努力寻找将 a
和 b
作为字符传递的最佳方法,并且仍然在 on
子句中使用
# This works
func <- function(d1,d2,a,b) {
eval(substitute(d1[d2, on=.(a<b), nomatch=0]))
}
func(df1,df2,x,y)
根据 ?data.table
(1.14.3
)
env - List or an environment, passed to substitute2 for substitution of parameters in
i, j and by (or keyby)
. Use verbose to preview constructed expressions.
未指定 env
与 on
的用法。没有 eval/substitute
的选项是在 on
named
向量
out1 <- df1[df2, on = setNames(b, a), nomatch = 0]
-检查实际列的输出
> out2 <- df1[df2, on = .(x = y), nomatch = 0]
> identical(out1, out2)
[1] TRUE
对于 non-equi 加入,正如@jangorecki 在评论中提到的,使用 substitute2
eval(substitute2(df1[df2, on = .(a <b), nomatch = 0], env = list(a=a, b = b)))
-输出
x xz yz
<int> <num> <num>
1: 5 -1.1259516 -0.78272556
2: 5 -0.4893074 -0.78272556
3: 5 1.8534867 -0.78272556
4: 5 -0.0376076 -0.78272556
5: 6 -1.1259516 -0.38678402
6: 6 -0.4893074 -0.38678402
7: 6 1.8534867 -0.38678402
8: 6 -0.0376076 -0.38678402
9: 6 -0.8409438 -0.38678402
10: 7 -1.1259516 1.18356550
11: 7 -0.4893074 1.18356550
12: 7 1.8534867 1.18356550
13: 7 -0.0376076 1.18356550
14: 7 -0.8409438 1.18356550
15: 7 2.4536938 1.18356550
16: 8 -1.1259516 1.01226735
17: 8 -0.4893074 1.01226735
18: 8 1.8534867 1.01226735
19: 8 -0.0376076 1.01226735
20: 8 -0.8409438 1.01226735
21: 8 2.4536938 1.01226735
22: 8 -0.4296828 1.01226735
23: 9 -1.1259516 0.64996351
24: 9 -0.4893074 0.64996351
25: 9 1.8534867 0.64996351
26: 9 -0.0376076 0.64996351
27: 9 -0.8409438 0.64996351
28: 9 2.4536938 0.64996351
29: 9 -0.4296828 0.64996351
30: 9 0.9030399 0.64996351
31: 10 -1.1259516 -1.23172125
32: 10 -0.4893074 -1.23172125
33: 10 1.8534867 -1.23172125
34: 10 -0.0376076 -1.23172125
35: 10 -0.8409438 -1.23172125
36: 10 2.4536938 -1.23172125
37: 10 -0.4296828 -1.23172125
38: 10 0.9030399 -1.23172125
39: 10 0.5757248 -1.23172125
40: 11 -1.1259516 0.21203485
41: 11 -0.4893074 0.21203485
42: 11 1.8534867 0.21203485
43: 11 -0.0376076 0.21203485
44: 11 -0.8409438 0.21203485
45: 11 2.4536938 0.21203485
46: 11 -0.4296828 0.21203485
47: 11 0.9030399 0.21203485
48: 11 0.5757248 0.21203485
49: 11 -1.1732665 0.21203485
50: 12 -1.1259516 -1.28178320
51: 12 -0.4893074 -1.28178320
52: 12 1.8534867 -1.28178320
53: 12 -0.0376076 -1.28178320
54: 12 -0.8409438 -1.28178320
55: 12 2.4536938 -1.28178320
56: 12 -0.4296828 -1.28178320
57: 12 0.9030399 -1.28178320
58: 12 0.5757248 -1.28178320
59: 12 -1.1732665 -1.28178320
60: 13 -1.1259516 -0.03909294
61: 13 -0.4893074 -0.03909294
62: 13 1.8534867 -0.03909294
63: 13 -0.0376076 -0.03909294
64: 13 -0.8409438 -0.03909294
65: 13 2.4536938 -0.03909294
66: 13 -0.4296828 -0.03909294
67: 13 0.9030399 -0.03909294
68: 13 0.5757248 -0.03909294
69: 13 -1.1732665 -0.03909294
70: 14 -1.1259516 0.25522954
71: 14 -0.4893074 0.25522954
72: 14 1.8534867 0.25522954
73: 14 -0.0376076 0.25522954
74: 14 -0.8409438 0.25522954
75: 14 2.4536938 0.25522954
76: 14 -0.4296828 0.25522954
77: 14 0.9030399 0.25522954
78: 14 0.5757248 0.25522954
79: 14 -1.1732665 0.25522954