1

在 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 相同的列名。但是 value 字段应该是 df1 和 df2 中的值的乘积。我期待以下输出

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

在R中可能吗?

4

4 回答 4

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必须转换为characterthennumeric以提取值:

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

于 2013-03-02T17:45:20.993 回答
5

如果所有日期都相同,那么您可以简单地使用:

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

如果两者的日期相同data.frames,请使用@MatthewLundberg下面的答案

于 2013-03-02T17:22:56.720 回答
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.frames 具有相同的列名,我已经指定我们只想通过 "date" 变量进行合并,以便两个 "value" 变量都出现在 "temp"data.frame中。

于 2013-03-02T17:26:03.207 回答
2

在您解决了 df1 和 df2 具有类型因子的“值”的问题之后,这确实是您在尝试此操作之前应该做的事情,您可以这样做:

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

R-FAQ: FAQ 7.10中介绍了应该为数字的因子的转换

于 2013-03-02T18:23:59.027 回答