代码之家  ›  专栏  ›  技术社区  ›  Rnovice

为列中的特定值范围计算r dataframe中的小计

  •  0
  • Rnovice  · 技术社区  · 6 年前

    我有一个数据框 df 其结构如下:

    NEW_UPC         IRI_KEY     WEEK      DOLLARS
    13000016961     272568      1220      3.29
    13000016961     272568      1221      3.29
    13000016961     272568      1222      3.29
    13000016961     272568      1223      9.87
    13000016962     272568      1224      3.29
    13000016961     272568      1224      9.87
    13000016962     272568      1225      3.29
    13000016961     272568      1225      9.87
    13000016962     272568      1226      3.29
    13000016961     272568      1226      9.87
    13000016961     272568      1227      9.87
    13000016961     272568      1228      3.29
    13000016963     272568      1228      3.29
    13000016963     272568      1229      3.29
    13000016962     272568      1230      3.29
    13000016961     272568      1230      3.29
    13000016963     272568      1230      13.16
    13000016962     272568      1231      3.29
    13000016963     272568      1231      9.87
    21600016430     272568      1231      17.43
    13000016962     272568      1232      9.87
    

    我想得到 DOLLARS 前12周 NEW_UPC - IRI_KEY 组合。我尝试了以下代码:

    df %>% 
      group_by(NEW_UPC,IRI_KEY) %>% 
      mutate(START = min(WEEK), END = max(WEEK)) %>% ungroup() %>%
      group_by(NEW_UPC,IRI_KEY) %>%
      summarise(Sales = case_when(WEEK<=(START+12) ~ sum(DOLLARS)))
    

    但是,我收到了以下错误消息:

    Error in summarise_impl(.data, dots) : 
    Column `Sales` must be length 1 (a summary value), not 8
    

    我在这里做错什么了?

    编辑:列中的值 Sales 更改为实际总数,以避免在评论中引起混淆。

    我想得到的最终输出如下:

    NEW_UPC         IRI_KEY     Sales
    13000016961     272568      65.8
    13000016962     272568      26.3
    13000016963     272568      29.6
    21600016430     272568      17.4
    

    请注意 销售额 上面的列只是我用来显示输出结构的随机数。而且,如果 新的 值为 美元 12周后 START ,我只想得到前12周的总数。所以, 销售额 列应返回从 开始 是的。或者,如果 新的 值为 美元 不到12周 开始 ,然后 销售额 应返回该期间的总数。

    1 回复  |  直到 6 年前
        1
  •  1
  •   MKR    6 年前

    你几乎就要解决了。您可以对数据进行排序 WEEK 然后上( head )12将为您提供前12周的数据。您可以尝试:

    library(dplyr)
    df %>% 
      group_by(NEW_UPC,IRI_KEY) %>%
      arrange(WEEK) %>%
      summarise(Sales = sum(head(DOLLARS,12)))
    
    # # A tibble: 4 x 3
    # # Groups: NEW_UPC [?]
    #       NEW_UPC IRI_KEY Sales
    #         <dbl>   <int> <dbl>
    # 1 13000016961  272568  65.8
    # 2 13000016962  272568  26.3
    # 3 13000016963  272568  29.6
    # 4 21600016430  272568  17.4
    

    数据:

    df <- read.table(text="
    NEW_UPC         IRI_KEY     WEEK      DOLLARS
    13000016961     272568      1220      3.29
    13000016961     272568      1221      3.29
    13000016961     272568      1222      3.29
    13000016961     272568      1223      9.87
    13000016962     272568      1224      3.29
    13000016961     272568      1224      9.87
    13000016962     272568      1225      3.29
    13000016961     272568      1225      9.87
    13000016962     272568      1226      3.29
    13000016961     272568      1226      9.87
    13000016961     272568      1227      9.87
    13000016961     272568      1228      3.29
    13000016963     272568      1228      3.29
    13000016963     272568      1229      3.29
    13000016962     272568      1230      3.29
    13000016961     272568      1230      3.29
    13000016963     272568      1230      13.16
    13000016962     272568      1231      3.29
    13000016963     272568      1231      9.87
    21600016430     272568      1231      17.43
    13000016962     272568      1232      9.87",
    header = TRUE)