内部加入 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" 解决方案,它在原始 df1
和 df2
数据框共享的 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))
我想做内部连接,条件是它应该给我减去 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" 解决方案,它在原始 df1
和 df2
数据框共享的 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))