2013-03-02 103 views
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相同的列名称。但值域应该是df1和df2中值的乘积。 我期待下面的输出

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

是否有可能在R'

+2

我假设有在您提供“DF3”输出一个错字。 – A5C1D2H2I1M1N2O1R2T1 2013-03-02 17:26:36

回答

4

如果所有的日期是相同的,那么你可以简单地使用:

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

如果日期不是两个data.frames相同,请使用以下

+0

所有日期均相等。但是会显示一条警告消息。警告消息: 在Ops.factor(DF3 $值,DF2 $值):*没有意义的因素 – 2013-03-02 17:42:54

+0

和值字段变成NA – 2013-03-02 17:44:35

+0

那么你值因素,而不是数字。您只需将它们先转换;) – 2013-03-02 18:02:59

3

或许你可以merge@MatthewLundberg答案两个data.frame s先,然后继续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■找相同的列名,我指定,我们只希望通过“日期”变量合并,这样既“值”变量会出现在“临时” data.frame

+1

@ flodel,感谢您的编辑。 – A5C1D2H2I1M1N2O1R2T1 2013-03-02 17:33:05

+0

先生。两个数据帧的值字段都是字符。所以这段代码显示了一些错误。我在语言R方面的经验很少,所以请帮助我。 – 2013-03-02 17:56:44

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 

如果你有一个数据帧的value列模式factor,你就必须转换为character然后numeric提取值:

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

这很聪明。+1 – A5C1D2H2I1M1N2O1R2T1 2013-03-02 17:48:33

+0

先生。两个数据帧的值字段都是字符。所以这段代码显示了一些错误。我在语言R方面的经验很少,所以请帮助我。 – 2013-03-02 17:57:27

+0

'factor'你的意思是?我会编辑。 – 2013-03-02 17:59:58

2

后您解决您与DF1和DF2有型因子的“价值”,这是真正成才您尝试此之前应该做的问题,你可以做这样的:

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

的因素转换应是数字是包括在R-FAQ:FAQ 7.10

+0

工作**如果**所有日期在两个数据框中都是通用的,所以''df1 $ value''和''df2 $ value''具有相同的长度,否则抛出错误。 – PatrickT 2016-06-04 10:09:57

+1

是的。在对其他问题的评论中,(3年前)表明OP有严重的数据管理问题,这些问题涉及到因素。用dput()提供的例子可以解决问题,并且包含任何额外的复杂性,因为您可能需要注意。 – 2016-06-04 15:59:47