R:合并数据帧

时间:2013-12-03 13:39:04

标签: r merge

我希望合并到数据帧,但我想合并它们的方式有点不常见。

我将举例说明:

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列。我已经检查过,第一列是一个字符,其余的是数字/整数。

有什么想法吗?

由于

麦克

3 个答案:

答案 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中,班级matrixdata.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
相关问题