【发布时间】:2015-08-02 22:51:31
【问题描述】:
我正在尝试成对匹配 4 个变量并添加具有查找值的列。在基础上,我会做merge(df1,df2, by.x=c("lsr","ppr"),by.y=c("li","pro")),其中df1 有9 个列,df2(2 个是lsr 和pro)df2 只有3 个,li,pro,和“价值”我感兴趣,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 和ppr 的重复。我还尝试设置两个键并以data.table 方式加入它们,并使用alpha 添加一个新列。但没有成功。
【问题讨论】:
-
如果您不需要外连接,您可以使用二元连接进行左连接、右连接或内连接。问题是你想要哪一个。虽然从您的基本 R 代码来看,您似乎想要一个内部连接?另外,您要保留哪一列?
df1中也没有pro列 -
谢谢。实际上我相信,在这种情况下,内连接和左连接是相同的,因为 lsr 和 ppr 或 li 和 pro 的所有组合都包含在 df1 和 df2 中。在 df1 中没有 pro 是一个错字!抱歉,我的意思是 df1 中的 ppr,我将对其进行编辑和更正。我想保留 df1 中的所有列并将 alpha 添加为新列
-
如果您只需要在更新
alpha列时对df1进行左连接,这是一个简单的二元连接。试试setkey(df1, lsr, ppr) ; setkey(df2, li, pro) ; df1[df2, alpha := i.alpha] ; df1 -
因此,如果您的
df1集合中已经有一个alpha列,i将告诉data.table从df2中的alpha获取信息。将i,放在 RHS 上的列名之前总是更安全,以避免可能的意外结果。 -
好的。现在我真的是 data.table 的粉丝。谢谢!
标签: r merge data.table