multiple left inner funcion data columns cheatsheet r merge inner-join dplyr

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