乘以两个数据帧

时间:2013-03-02 17:21:07

标签: r dataframe

在R中,我有2个数据帧" df1"和" df2"。 df1和df2如下。

>df1
  date      value
1 1990-10-10  3
2 1990-10-11  2.3
3 1990-10-12  2.5

>df2
  date      value
1 1990-10-10  3
2 1990-10-11  2
3 1990-10-12  2

我需要第三个数据框" df3",它包含与df1和df2相同的列名。但是值字段应该是df1和df2中值的乘积。 我期待以下输出

>df3
  date      value
1 1990-10-10  9
2 1990-10-11  4.6
3 1990-10-12  4

是否可以在R?

4 个答案:

答案 0 :(得分:8)

“合并”与rbind的漫长道路,并使用aggregate制作产品:

aggregate(value ~ date, data=rbind(df1,df2), FUN=prod)
##         date value
## 1 1990-10-10   9.0
## 2 1990-10-11   4.6
## 3 1990-10-12   5.0

如果您对数据框的factor列有value模式,则必须转换为character,然后转换为numeric以提取值:< / p>

df1$value <- as.factor(df1$value)
df2$value <- as.factor(df2$value)

aggregate(as.numeric(as.character(value)) ~ date, data=rbind(df1,df2), FUN=prod)
##         date as.numeric(as.character(value))
## 1 1990-10-10                             9.0
## 2 1990-10-11                             4.6
## 3 1990-10-12                             5.0

您也可以使用as.numeric(levels(value))[value]进行转换。有关详细信息,请参阅?factor

答案 1 :(得分:5)

如果所有日期都相同,那么您只需使用:

df3 <- df1
df3$value <- as.numeric(as.character(df3$value))
df3$value <- df3$value * as.numeric(as.character(df2$value))

如果两个data.frames中的日期 NOT 相同,请使用下面的@MatthewLundberg回答

答案 2 :(得分:3)

也许您可以先merge两个data.frame,然后继续transform

> temp <- merge(df1, df2, by = "date")
> temp
        date value.x value.y
1 1990-10-10     3.0       3
2 1990-10-11     2.3       2
3 1990-10-12     2.5       2
> transform(temp, Prod = value.x * value.y)
        date value.x value.y Prod
1 1990-10-10     3.0       3  9.0
2 1990-10-11     2.3       2  4.6
3 1990-10-12     2.5       2  5.0

这里,由于两个data.frame具有相同的列名,我已经指定我们只想通过“date”变量进行合并,这样两个“value”变量都会出现在“temp”中data.frame

答案 3 :(得分:2)

修复df1和df2的问题后,问题是&#34;值&#34;在尝试这个之前你应该做的类型因素,你可以做到这一点:

df3 <- data.frame( data=df1$date, value=df1[ ,"value"]*df2[ ,"value"])

R-FAQ:FAQ 7.10

涵盖了应该是数字因素的转换