R: fusión de marcos de datos

Estoy buscando fusionar marcos de datos, pero la forma en que me gustaría fusionarlos es un poco poco común.

Lo ilustraré con un ejemplo:

Matrix1
Col1 Col2 Vol VWAP Value  
ABC    1   2    4   8
ABC    2   3    5   15  
DEF    1   8    9   72  
DEF    2   8    9   72  

Matrix 2  
Col1 Col2 Vol VWAP Value  
ABC   1     4   7   28  
ABC   2     5   1   5  
HIJ   1     6   6   36  
HIJ   2     7   3   21  

Me gustaría obtener la siguiente matriz:

Matrix3

Col1 Col2 Vol VWAP Value
ABC   1    6   6    36  
ABC   2    8   2.5  20
DEF   1    8   9    72
DEF   2    8   9    72
HIJ   1    6   6    36
HIJ   2    7   3    21

En las dos primeras matrices, la columna VWAP es solo la columna Valor dividida por la columna Vol. La tercera matriz combina las dos primeras de la siguiente manera: si las dos primeras columnas son iguales, agregue las columnas Vol y Valor de las filas correspondientes. Si no hay ninguna coincidencia, simplemente agregue las filas no coincidentes al final de la matriz. La columna VWAP de Matrix3 es nuevamente solo la columna Valor dividida por la columna Vol.

He probado lo siguiente:

Matrix3 = merge(Matrix1 ,Matrix2, all = TRUE)  
Matrix3[,4] = Matrix3[,5]/Matrix3[,3]

pero por alguna razón no está sumando las columnas Vol o Value. Lo he comprobado, y la primera columna es un carácter, mientras que el resto son numéricos/enteros.

¿Alguna idea?

Muchas Gracias

Mike

preguntado el 03 de diciembre de 13 a las 13:12

¿Cuál es el resultado de su fusión? No veo dónde debería ocurrir la suma en su código. Supongo que deberías obtener Matrix3 con Vol.X y Vol.Y. Le sugiero que especifique el parámetro por. -

3 Respuestas

Si los trata como marcos de datos, puede agregarlos primero usando rbind() luego use `ddply()' para resumir el Vol, el Valor y calcular el V

df1<-data.frame(Col1=c("ABC","ABC","DEF","DEF"),
                Col2=c(1,2,1,2),
                Vol=c(2,3,8,8),
                VWAP=c(4,5,9,9),
                Value=c(8,15,72,72))  

df2<-data.frame(Col1=c("ABC","ABC","HIJ","HIJ"),
                Col2=c(1,2,1,2),
                Vol=c(4,5,6,7),
                VWAP=c(7,1,6,3),
                Value=c(28,5,36,21))  

merged=rbind(df1,df2)             # stick the dfs together
require(plyr)                     # library
ddply(merged,
     .(Col1,Col2),
     summarize,
     Vol=sum(Vol),
     VWAP=sum(Value)/sum(Vol),
     Value=sum(Value))

  Col1 Col2 Vol VWAP Value
1  ABC    1   6  6.0    36
2  ABC    2   8  2.5    20
3  DEF    1   8  9.0    72
4  DEF    2   8  9.0    72
5  HIJ    1   6  6.0    36
6  HIJ    2   7  3.0    21

Respondido el 03 de diciembre de 13 a las 14:12

Además de esta respuesta, recomiendo leer sobre el Estrategia de dividir-aplicar-combinar. - campo de bestias

Primero un comentario sobre la notación: No llame a su data.frame Matriz1. En R las clases matrix y data.frame son diferentes.

De todos modos, el comando de combinación no puede saber que se supone que debe agregar las columnas "Valor" y "Vol". Primero debe fusionar y luego ocuparse de la adición después. Así es como puedes resolver esto:

m3 <- merge(Matrix1, Matrix2, by=c("Col1", "Col2"), all=TRUE)
# add vol and value
m3[, "Vol"] <- rowSums(m3[, c("Vol.x", "Vol.y")], na.rm=TRUE)
m3[, "Value"] <- rowSums(m3[, c("Value.x", "Value.y")], na.rm=TRUE)
# divide to get vwap
m3[, "VWAP"] <- m3[, "Value"]/m3[, "Vol"]
# extract result
res <- m3[, c("Col1", "Col2", "Vol", "VWAP", "Value")]
res 
##    Col1 Col2 Vol VWAP Value
##  1  ABC    1   6  6.0    36
##  2  ABC    2   8  2.5    20
##  3  DEF    1   8  9.0    72
##  4  DEF    2   8  9.0    72
##  5  HIJ    1   6  6.0    36
##  6  HIJ    2   7  3.0    21

Respondido el 03 de diciembre de 13 a las 14:12

Puedes hacerlo manualmente:

id <- mat1$Col1 %in% mat2$Col1 &
    mat1$Col2 %in% mat2$Col2

mat1[id,c('Vol')] <- colSums(rbind(mat1[id,c('Vol')],
                    mat2[id,c('Vol')]))

mat1[id,c('Value')] <- colSums(rbind(mat1[id,c('Value')],
                                     mat2[id,c('Value')]))

m3 <- rbind(mat1,mat2[!id,])

m3[, "VWAP"] <- m3[, "Value"]/m3[, "Vol"]

# Col1 Col2 Vol VWAP Value
# 1   ABC    1   6  6.0    36
# 2   ABC    2   8  2.5    20
# 3   DEF    1   8  9.0    72
# 4   DEF    2   8  9.0    72
# 31  HIJ    1   6  6.0    36
# 41  HIJ    2   7  3.0    21

Respondido el 03 de diciembre de 13 a las 14:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.