【问题标题】:multiplying two data frames将两个数据帧相乘
【发布时间】:2013-02-17 02:32:22
【问题描述】:

在 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 中可以吗?

【问题讨论】:

  • 我假设您提供的“df3”输出中有错字。

标签: r dataframe


【解决方案1】:

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

【讨论】:

  • 先生。两个数据帧的值字段都是字符。所以这段代码显示了一些错误。我对R语言的经验很少。所以请帮助我。
  • @DinoopNair,出于这个原因,我们通常建议使用dput(YourData),而不是像您在此处和其他问题中所做的那样仅粘贴输出。查看您的其他一些问题,其他人以前曾要求您这样做,因此请在将来注意此建议。谢谢。
  • @AnandaMahto:我很抱歉我的错误。下次我会听从你的话。谢谢。
【解决方案2】:

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

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

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

【讨论】:

  • 所有日期都相同。但会显示一条警告消息。警告消息:在 Ops.factor(df3$value, df2$value) 中:* 对因子没有意义
  • 并且值字段变为NA
  • 那么您的值是因子而不是数字。你只需要先转换它们;)
  • 您必须先转换为character,然后再转换为numeric
  • @MatthewLundberg,谢谢你发现我的马虎!编辑反映。
【解决方案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 具有相同的列名,我已经指定我们只想通过“日期”变量进行合并,这样两个“值”变量都将出现在“临时”@987654326 @。

【讨论】:

  • 先生。两个数据帧的值字段都是字符。所以这段代码显示了一些错误。我对R语言的经验很少。所以请帮助我。
【解决方案4】:

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

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

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

【讨论】:

  • 有效 if 所有日期在两个数据帧中都是通用的,因此 df1$valuedf2$value 具有相同的长度,否则会引发错误。
  • 是的。在其他问题的 cmets 中,很明显(3 年前)OP 存在涉及因素的严重数据管理问题。使用 dput() 提供的示例并包括您建议可能需要注意的任何额外复杂性,问题会更快地解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多