内部加入R中的条件

时间:2015-07-02 08:50:13

标签: r merge 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

我想要的结果是

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

基本上我正在加入两个表格,而我正在接受列值

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

我一直在努力,但无法找到任何方法在基础R中进行这种条件合并。可能如果基础R不可能,dplyr应该能够用inner_join()做到这一点,但我不太清楚这个包。

因此,任何基础R和/或dplyr的建议都将受到赞赏

编辑

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

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

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

所有逻辑相同,我想加入这两个表,每个表的长度为160行。我希望通过ID加入,并从两个表中获取列值的差异。结果数据集应具有相同的行数,即160列,具有额外的列diff

3 个答案:

答案 0 :(得分:5)

使用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

答案 1 :(得分:3)

这是一个"基础R"解决方案使用原始merge()Term数据框共享的df1列上的df2函数:

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

答案 2 :(得分:2)

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

首先使用inner_join然后使用transmute来保存变量并计算并添加新变量。

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