data.table 按多列合并
data.table merge by multiple columns
我正在尝试成对匹配 4 个变量并添加一个包含查找值的列。在基础上,我会做 merge(df1,df2, by.x=c("lsr","ppr"),by.y=c("li","pro"))
,其中 df1
有 9 个列,df2
(2 个是 lsr
和 pro
)df2
只有 3 个列,li
,pro
,还有我感兴趣的"value",alpha
。
这很好用,但由于我开始成为 data.table
的超级粉丝,我想以 data.table
的方式进行操作 - 因为我有数百万行- 所以基础合并很慢(我看到 by.x
和 by.y
功能正在等待 data.table
,但也许有解决方法)。请参阅下面的一些示例数据:
df2:
alpha li pro
1: 0.5000000 0.01666667 0.01666667
2: 0.3295455 0.03333333 0.01666667
3: 0.2435897 0.05000000 0.01666667
4: 0.1917808 0.06666667 0.01666667
5: 0.1571429 0.08333333 0.01666667
df1:
demand rtime mcv mck ppr mlv mlk lsr
1: 0.3 1 357.57700 0.099326944 0.01666667 558.27267 0.155075741 0.01666667
2: 0.3 10 548.75433 0.152431759 0.01666667 614.30667 0.170640741 0.03333333
3: 0.3 11 314.55767 0.087377130 0.01666667 636.48100 0.176800278 0.03333333
4: 0.3 2 312.15033 0.086708426 0.01666667 677.48100 0.188189167 0.06666667
5: 0.3 3 454.47867 0.126244074 0.01666667 608.92067 0.169144630 0.01666667
---
6899196: 0.6 5 537.92673 0.149424093 1.00000000 537.92673 0.149424093 1.00000000
6899197: 0.6 6 277.34732 0.077040923 1.00000000 277.34732 0.077040923 1.00000000
6899198: 0.6 7 73.31484 0.020365235 1.00000000 73.31484 0.020365235 1.00000000
6899199: 0.6 8 32.04197 0.008900546 1.00000000 32.04197 0.008900546 1.00000000
6899200: 0.6 9 14.59008 0.004052799 1.00000000 14.59008 0.004052799 1.00000000
最后,也许有趣的是,在 df2
中我有独特的行,而在 df1
中我有很多关于 lsr
和 [=29= 的重复行].我还尝试设置两个键并以 data.table
方式连接它们,并使用 alpha
添加一个新列。但没有成功。
您可以在评论中使用 David Arenburg 提供的声明:
setkey(df1, lsr, ppr)
setkey(df2, li, pro)
df1[df2, alpha := i.alpha]
从 current devel version, 1.9.5 开始,我们可以直接执行连接,而无需使用 on
参数设置键:
df1[df2, alpha := i.alpha, on = c(lsr="li", ppr="pro")]
如果你不想安装devel版本,那么你可以等到这个在CRAN上推送为v1.9.6。
我正在尝试成对匹配 4 个变量并添加一个包含查找值的列。在基础上,我会做 merge(df1,df2, by.x=c("lsr","ppr"),by.y=c("li","pro"))
,其中 df1
有 9 个列,df2
(2 个是 lsr
和 pro
)df2
只有 3 个列,li
,pro
,还有我感兴趣的"value",alpha
。
这很好用,但由于我开始成为 data.table
的超级粉丝,我想以 data.table
的方式进行操作 - 因为我有数百万行- 所以基础合并很慢(我看到 by.x
和 by.y
功能正在等待 data.table
,但也许有解决方法)。请参阅下面的一些示例数据:
df2:
alpha li pro
1: 0.5000000 0.01666667 0.01666667
2: 0.3295455 0.03333333 0.01666667
3: 0.2435897 0.05000000 0.01666667
4: 0.1917808 0.06666667 0.01666667
5: 0.1571429 0.08333333 0.01666667
df1:
demand rtime mcv mck ppr mlv mlk lsr
1: 0.3 1 357.57700 0.099326944 0.01666667 558.27267 0.155075741 0.01666667
2: 0.3 10 548.75433 0.152431759 0.01666667 614.30667 0.170640741 0.03333333
3: 0.3 11 314.55767 0.087377130 0.01666667 636.48100 0.176800278 0.03333333
4: 0.3 2 312.15033 0.086708426 0.01666667 677.48100 0.188189167 0.06666667
5: 0.3 3 454.47867 0.126244074 0.01666667 608.92067 0.169144630 0.01666667
---
6899196: 0.6 5 537.92673 0.149424093 1.00000000 537.92673 0.149424093 1.00000000
6899197: 0.6 6 277.34732 0.077040923 1.00000000 277.34732 0.077040923 1.00000000
6899198: 0.6 7 73.31484 0.020365235 1.00000000 73.31484 0.020365235 1.00000000
6899199: 0.6 8 32.04197 0.008900546 1.00000000 32.04197 0.008900546 1.00000000
6899200: 0.6 9 14.59008 0.004052799 1.00000000 14.59008 0.004052799 1.00000000
最后,也许有趣的是,在 df2
中我有独特的行,而在 df1
中我有很多关于 lsr
和 [=29= 的重复行].我还尝试设置两个键并以 data.table
方式连接它们,并使用 alpha
添加一个新列。但没有成功。
您可以在评论中使用 David Arenburg 提供的声明:
setkey(df1, lsr, ppr)
setkey(df2, li, pro)
df1[df2, alpha := i.alpha]
从 current devel version, 1.9.5 开始,我们可以直接执行连接,而无需使用 on
参数设置键:
df1[df2, alpha := i.alpha, on = c(lsr="li", ppr="pro")]
如果你不想安装devel版本,那么你可以等到这个在CRAN上推送为v1.9.6。