我希望合并到数据帧,但我想合并它们的方式有点不常见。
我将举例说明:
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
我想得到以下矩阵:
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
在前两个矩阵中,VWAP列只是Value列除以Vol列。 第三个矩阵以下列方式组合前两个:如果前两个Cols相同,则添加匹配行的Vol和Value cols。如果没有匹配,只需将不匹配的行添加到矩阵的末尾。然后,Matrix3的VWAP列再次只是值col除以Vol col。
我尝试了以下内容:
Matrix3 = merge(Matrix1 ,Matrix2, all = TRUE)
Matrix3[,4] = Matrix3[,5]/Matrix3[,3]
但由于某种原因,它不是汇总Vol或Value列。我已经检查过,第一列是一个字符,其余的是数字/整数。
有什么想法吗?
由于
麦克
答案 0 :(得分:3)
如果将它们视为数据框,则可以先使用rbind()
附加它们,然后使用`ddply()'汇总Vol,Value并计算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
答案 1 :(得分:1)
首先评论符号:不要打电话给data.frame
Matrix1。在R
中,班级matrix
和data.frame
不同。
无论如何,merge命令不可能知道它应该添加你的“Value”和“Vol”列。你应该首先合并,然后再照顾加法。以下是解决这个问题的方法:
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
答案 2 :(得分:0)
您可以手动执行此操作:
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