在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?
答案 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
涵盖了应该是数字因素的转换