R: fusión de marcos de datos
Frecuentes
Visto 196 veces
2
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
3 Respuestas
3
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
1
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
0
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 r merge or haz tu propia pregunta.
¿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. - JerryWho