内部加入 R 中的条件

Inner Join with conditions in R

我想做内部连接,条件是它应该给我减去 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

我要的结果是

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

基本上我加入了两个 tables 和我正在使用的列值

Value=  abs(df1$Value - df2$Value)

我一直在努力,但找不到任何方法来在 base R 中执行此条件合并。可能如果 base R 不可能,dplyr 应该可以用 inner_join() 做到这一点,但我是不太了解这个包的大部分内容。

因此,任何基于 R and/or dplyr 的建议将不胜感激

正在编辑

我已经按照要求包含了我的原始数据。我的数据在这里

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

DF1 第一 table,DF2 第二。 DF2从第168行开始

所有逻辑相同,我想连接这两个长度为 160 行的 table。我想按 ID 加入并从两个 table 中获取列值的差异。结果数据集应具有相同的行数,即 160 行和额外的列 diff

这是一个 "base R" 解决方案,它在原始 df1df2 数据框共享的 Term 列上使用 merge() 函数:

df_merged <- merge(df1, df2, by="Sec")
df_merged$Value <- abs(df_merged$Value.x - df_merged$Value.y)
df_merged <- df_merged[, c("Sec", "Term.x", "Value")]
names(df_merged)[2] <- "Term"

> df_merged
  Sec Term Value
1  s1   T1    30
2  s2   T2    20
3  s3   T3    10

使用 data.table 的二进制联接,您可以在联接时修改列。 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

由于这是一个 dplyr 问题,这里是一个 dplyr 解决方案:

首先使用inner_join然后transmute来保留变量并计算并追加一个新变量。

inner_join(df1, df2, by = "Sec") %>% 
  transmute(Term = Term.x, Sec, Value = abs(Value.x - Value.y))