【问题标题】:How to divide a data frame column by a value in another column, repeating for multiple products in a data frame?如何将数据框列除以另一列中的值,对数据框中的多个产品重复?
【发布时间】:2017-11-02 14:14:33
【问题描述】:

我有两个数据框,AB。两个数据框都具有三种不同产品的值。

这是一个:

    Product Q1
1 Product X  4
2 Product Y  7
3 Product Z  8

这里是 B:

    Product Q1
1 Product X 41
2 Product Y 72
3 Product Z 89

我想通过执行以下操作对这些数据帧进行计算:

  • 产品 X 在 A 中的 Q1 值除以 产品 X 在 B 中的 Q1 值。然后将产品 X 在 A 中的 Q1 值除以 产品 Y 在 B 中的 Q1 值。然后到 Z。(所以 产品 X 在 A 中的 Q1 值 是一个常数,它被 B 中每个产品的 Q1 值除。)
  • 那么下一列将是相同的,但 产品 Y 在 Q 中的 Q1 值
  • 最后,Z 也是如此。

理想情况下,我最终会得到这样的数据框:

    Product ProductXdiv ProductYdiv ProductZdiv
1 Product X  0.09756098  0.17073171  0.19512195
2 Product Y  0.05555556  0.09722222  0.11111111
3 Product Z  0.04494382  0.07865168  0.08988764

是否有一个包可以帮助以相当简单的方式计算这个?还是需要自定义功能?非常感谢您的建议。

【问题讨论】:

  • a <- c(4, 7, 8) ; b <- c(41, 72, 89) ; outer(a, b, "/")a %*% t(1 / b)(可能再次转置)

标签: r


【解决方案1】:

使用sapply 迭代A[,2]B[,2] 的单行代码。您可以使用setNames 重命名您认为合适的列。

cbind(A, sapply(A[,2], function(d) sapply(B[,2], function(x) d/x)))

   Product Q1          1          2          3
1 ProductX  4 0.09756098 0.17073171 0.19512195
2 ProductY  7 0.05555556 0.09722222 0.11111111
3 ProductZ  8 0.04494382 0.07865169 0.08988764

【讨论】:

  • 哇,这比我想象的要简单得多。谢谢你。另一个简单的问题:假设我在 A 和 B 中都有 Q2 列...我如何将您建议的功能应用于 Q1 而不是后续列?
【解决方案2】:

这是一个整洁的解决方案。

library(tidyr)
library(magrittr)

A<-data.frame(Product<-c("X","Y","Z"),Q1<-c(4,7,8))
B<-data.frame(Product<-c("X","Y","Z"),Q1<-c(41,72,89))

x<-merge.data.frame(A,B,by=NULL)
names(x)<-c("ProductA","Q1A","ProductB","Q1B")

x%<>%mutate(div=Q1A/Q1B)%>%
    select(-Q1A,-Q1B)%>%
    spread(ProductB,div)

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多