R中的内部连接条件

use*_*590 3 merge r inner-join dplyr

我想做内部连接,条件是它应该减去2列。

df1 = data.frame(Term = c("T1","T2","T3"), Sec = c("s1","s2","s3"), Value =c(10,30,30))

df2 = data.frame(Term = c("T1","T2","T3"), Sec = c("s1","s3","s2"), Value =c(40,20,10)

 df1
 Term Sec Value
  T1  s1    10
  T2  s2    30
  T3  s3    30

  df2
  Term  Sec Value
  T1  s1    40
  T2  s3    20
  T3  s2    10
Run Code Online (Sandbox Code Playgroud)

我想要的结果是

  Term  Sec Value
   T1   s1   30
   T2   s2   20
   T3   s3   10
Run Code Online (Sandbox Code Playgroud)

基本上我要联接两个表,并且要获取列值

Value=  abs(df1$Value - df2$Value)
Run Code Online (Sandbox Code Playgroud)

我一直在苦苦挣扎,但找不到任何方法可以在基本R中进行此条件合并。可能如果基本R无法实现,则dplyr应该可以使用inner_join()做到这一点,但是我对这个程序包的了解并不多。

因此,任何带有基数R和/或dplyr的建议将不胜感激

编辑中

我已按要求提供了我的原始数据。我的数据在这里

https://jsfiddle.net/6z6smk80/1/

DF1是第一个表,DF2是第二个表。DF2从第168行开始。

所有逻辑都相同,我想将这两张表的长度各为160行。我想通过ID加入,并从两个表中获取“列值”的差异。结果数据集应具有相同的行数,该行数为160,并具有额外的列差异

Dav*_*urg 5

使用data.tables二进制联接,您可以在联接时修改列。nomatch = 0L确保您正在进行内部联接

library(data.table)
setkey(setDT(df2), Sec)
setkey(setDT(df1), Sec)[df2, .(Term, Sec, Value = abs(Value - i.Value)), nomatch = 0L]
#    Term Sec Value
# 1:   T1  s1    30
# 2:   T2  s2    20
# 3:   T3  s3    10
Run Code Online (Sandbox Code Playgroud)