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,并具有额外的列差异
使用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)