left - Inner Join con las condiciones en R
join multiple data frames in r (3)
Aquí hay una solución "base R" que utiliza la función merge()
en la columna Term
compartida por sus marcos de datos df1
y df2
originales:
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
Quiero hacer una combinación interna con la condición de que debería darme la resta de 2 columnas.
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
El resultado que quiero es
Term Sec Value
T1 s1 30
T2 s2 20
T3 s3 10
Básicamente me estoy uniendo a dos tablas y por el valor de columna que estoy tomando
Value= abs(df1$Value - df2$Value)
He luchado pero no he encontrado ninguna forma de hacer esta fusión condicional en la base R. Probablemente si no es posible con la base R, dplyr debería poder hacer eso con inner_join () pero no estoy muy consciente de gran parte de este paquete.
Por lo tanto, cualquier sugerencia con base R y / o dplyr será apreciada
EDICIÓN
He incluido mis datos originales según lo pedido. Mis datos estan aqui
https://jsfiddle.net/6z6smk80/1/
DF1 es la primera tabla y DF2 es el segundo. DF2 comienza en la fila 168.
Toda la lógica es lo mismo, quiero unir estas dos tablas cuya longitud es de 160 filas cada una. Deseo unirme por ID y tomar la diferencia del valor de la columna de ambas tablas. El conjunto de datos resultante debe tener el mismo número de filas, que es 160 con diferencia de columna adicional
Como esta es una pregunta dplyr, aquí hay una solución dplyr:
Primero use inner_join
y luego transmute
para guardar variables y calcular y agregar una nueva.
inner_join(df1, df2, by = "Sec") %>%
transmute(Term = Term.x, Sec, Value = abs(Value.x - Value.y))
Usando data.table
s binary join puede modificar columnas mientras se une. nomatch = 0L
asegura que estás haciendo una unión interna
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