【问题标题】:how to do math operation in data frame and make a new column of its results?如何在数据框中进行数学运算并为其结果创建新列?
【发布时间】:2019-06-25 20:45:02
【问题描述】:

我想使用一些基本的数学计算来了解我们每天需要多少库存。我想将库存除以开始日期和结束日期的差异,这样我就可以每天获得库存。 我目前有这样的数据

 promo  start_date  end_date  item   discount   stock
    a     30/08/19   02/09/19   ax      15%       200      
    a     30/08/19   02/09/19   bx      15%       200
    a     27/08/19   27/08/19   cx      25%       200
    a     27/08/19   27/08/19   dx      15%       200
    b     03/09/19   10/09/19   ex      15%       200
    b     04/09/19   04/09/19   fx      15%       200

变成这样

promo   date    item   discount   stock  stock/day
   a    30/08/19   ax      15%       200     50
   a    31/08/19   ax      15%       200     50
   a    01/09/19   ax      15%       200     50
   a    02/09/19   ax      15%       200     50
   a    30/08/19   bx      15%       200     50
   a    31/08/19   bx      15%       200     50
   a    01/09/19   bx      15%       200     50
   a    02/09/19   bx      15%       200     50
   a    27/08/19   cx      25%       200    200 
   a    27/08/19   dx      15%       200    200
   b    03/09/19   ex      15%       200     25
   b    04/09/19   ex      15%       200     25
        ... continue as above
   b    09/09/19   ex      15%       200     25
   b    10/09/19   ex      15%       200     25
   b    04/09/19   fx      15%       200    200

有人知道怎么做吗?

【问题讨论】:

  • 1) 通过as.Datestart_dateend_date 转换为Date 对象。 2) 使用difftimeunits="days" 来获取日期之间的天数。 3) 除以这样的差额。 (我更改了列名以使表格可以使用read.table 读取)。
  • 但除此之外如何制作新栏目?
  • 要为 R data.frame 创建一个新列,您可以使用 $<-。例如:df$newcolumn<-value 将创建一个名为newcolumn 的列,其值由value 对象确定。例如:data(iris); iris$random<-runif(150) 将在 iris 数据集中添加一个名为 random 的列,其中包含 150 个随机值。

标签: r date division populate


【解决方案1】:

tidyverse 的一种可能是:

df %>%
 mutate(date = map2(start_date, end_date, seq, by = "1 day")) %>%
 select(-start_date, -end_date) %>%
 unnest() %>%
 group_by(item) %>%
 mutate(stock_day = stock/n())

   promo item  discount stock date       stock_day
   <chr> <chr> <chr>    <int> <date>         <dbl>
 1 a     ax    15%        200 2019-08-30        50
 2 a     ax    15%        200 2019-08-31        50
 3 a     ax    15%        200 2019-09-01        50
 4 a     ax    15%        200 2019-09-02        50
 5 a     bx    15%        200 2019-08-30        50
 6 a     bx    15%        200 2019-08-31        50
 7 a     bx    15%        200 2019-09-01        50
 8 a     bx    15%        200 2019-09-02        50
 9 a     cx    25%        200 2019-08-27       200
10 a     dx    15%        200 2019-08-27       200
11 b     ex    15%        200 2019-09-03        25
12 b     ex    15%        200 2019-09-04        25
13 b     ex    15%        200 2019-09-05        25
14 b     ex    15%        200 2019-09-06        25
15 b     ex    15%        200 2019-09-07        25
16 b     ex    15%        200 2019-09-08        25
17 b     ex    15%        200 2019-09-09        25
18 b     ex    15%        200 2019-09-10        25
19 b     fx    15%        200 2019-09-04       200

【讨论】:

  • 如果我不仅要按商品分组,还要按促销分组,如何编写代码?是 group_by(promo,item) 吗?
  • 完全一样,是的:)
猜你喜欢
  • 2020-12-23
  • 1970-01-01
  • 2015-08-31
  • 2014-03-08
  • 1970-01-01
  • 2019-04-07
  • 2018-01-27
  • 2017-12-28
  • 2022-07-14
相关资源
最近更新 更多