/ / Cómo agregar elementos de columnas compartidas entre dos marcos de datos en R - r, unir, unir

Cómo agregar elementos de columnas compartidas entre dos dataframes en R - r, merge, match

Tengo dos marcos de datos:

Marco de datos # 1

A   B   C   D   E
2   1   0   5   7

y

Marco de datos # 2

C   E   F   G
3   1   0   9

Me gustaría combinar los dos marcos de datos de modo que el primer marco de datos sirva como referencia y las columnas en común se agreguen

La solución debería verse como:

A   B   C   D   E
2   1   3   5   8

Note los elementos de las columnas compartidas.(las columnas C y E) se agregaron y las columnas adicionales en el Dataframe # 2 (columnas F y G) se ignoraron porque no se encontraron en el Dataframe # 1. Cada Dataframe tiene una sola fila.

He intentado lograr esto con el nativofunciona tanto en R como en el paquete de combinación, pero no he tenido suerte. En mi aplicación necesito combinar miles de columnas, muchas de las cuales se comparten entre los dos marcos de datos, por lo que estoy trabajando en el desarrollo de una solución sólida.

¡Gracias!

Respuestas

3 para la respuesta № 1

Esto debería funcionar:

overlap = intersect(names(df1), names(df2))
df1[overlap] = df1[overlap] + df2[overlap]

Asume que el número de filas en los marcos de datos es el mismo en cada marco de datos.


1 para la respuesta № 2

Puede ser más fácil convertir primero de formato ancho a largo, hacer las operaciones y luego volver a convertir. Por ejemplo, usando dplyr y tidyr:

library(dplyr)
library(tidyr)
df1 <- data.frame(A = 2, B = 1, C = 0, D = 5, E = 7)
df2 <- data.frame(C = 3, E = 1, F = 0, G = 9)

df1 %>%
gather(variable, value) %>%
left_join(gather(df2, variable, value), by = "variable") %>%
rowwise() %>%
mutate(sum = sum(value.x, value.y, na.rm = TRUE)) %>%
select(variable, sum) %>%
spread(variable, sum)

Lo que esto hace: coloca las variables de df1 en 1 columna y sus valores en otra; hace lo mismo con df2; combina df1 y df2 usando df1 como referencia; suma los valores para cada variable; selecciona la columna de la variable y los nuevos valores (sumas); Convierte de nuevo a formato ancho.

Resultado:

# A tibble: 1 × 5
A     B     C     D     E
* <dbl> <dbl> <dbl> <dbl> <dbl>
1     2     1     3     5     8

En general, cuando tiene la misma medida para múltiples variables en muchas columnas, vale la pena considerar si el formato largo es una mejor representación de los datos.