我想做内连接的条件是它应该减去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
答案 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))