【问题标题】:R: Replicate value in the column of a dataframe based on a conditionR:根据条件复制数据框列中的值
【发布时间】:2019-09-06 15:53:56
【问题描述】:

我有以下数据框:

Categ <- rep(c("BODY", "FACE"), times = c(8,4))
Brand1 <- rep(c("XXX", "YYY"), times = c(8,4))
Product1 <- rep(c("X1", "X2", "Y1"), each =4)
Month <- rep(c("01-18", "02-18", "03-18", "04-18"), times =3)
Sales1 <- c(0,300,0,0,0,0,20,0,0,400,0,0)
df <- data.frame(Categ,Brand1, Product1,Month, Sales1 )
df

   Categ Brand1 Product1 Month Sales1
1   BODY    XXX       X1 01-18      0
2   BODY    XXX       X1 02-18    300
3   BODY    XXX       X1 03-18      0
4   BODY    XXX       X1 04-18      0
5   BODY    XXX       X2 01-18      0
6   BODY    XXX       X2 02-18      0
7   BODY    XXX       X2 03-18     20
8   BODY    XXX       X2 04-18      0
9   FACE    YYY       Y1 01-18      0
10  FACE    YYY       Y1 02-18    400
11  FACE    YYY       Y1 03-18      0
12  FACE    YYY       Y1 04-18      0

如何将 Sales1 列中的值复制到 [i-1] 之前的一个单元格和 [i+1] 同一列中的值之后的一个单元格?

输出应如下所示:

Categ Brand1 Product1 Month Sales1
1   BODY    XXX       X1 01-18    300
2   BODY    XXX       X1 02-18    300
3   BODY    XXX       X1 03-18    300
4   BODY    XXX       X1 04-18      0
5   BODY    XXX       X2 01-18      0
6   BODY    XXX       X2 02-18     20
7   BODY    XXX       X2 03-18     20
8   BODY    XXX       X2 04-18     20
9   FACE    YYY       Y1 01-18    400
10  FACE    YYY       Y1 02-18    400
11  FACE    YYY       Y1 03-18    400
12  FACE    YYY       Y1 04-18      0

如果可能的话,我正在寻找基于 R 的解决方案。 有人可以帮忙吗?

【问题讨论】:

    标签: r dataframe repeat replicate


    【解决方案1】:

    我们可以在按“Categ”、“Brand1”和“Product1”分组的“Sales1”的leadlag 值上使用pmax

    library(dplyr)
    df %>% 
      group_by(Categ, Brand1, Product1) %>% 
      mutate(Sales1 = pmax(Sales1, lead(Sales1), lag(Sales1), na.rm = TRUE))
    # A tibble: 12 x 5
    # Groups:   Categ [2]
    #   Categ Brand1 Product1 Month Sales1
    #   <fct> <fct>  <fct>    <fct>  <dbl>
    # 1 BODY  XXX    X1       01-18    300
    # 2 BODY  XXX    X1       02-18    300
    # 3 BODY  XXX    X1       03-18    300
    # 4 BODY  XXX    X1       04-18      0
    # 5 BODY  XXX    X2       01-18      0
    # 6 BODY  XXX    X2       02-18     20
    # 7 BODY  XXX    X2       03-18     20
    # 8 BODY  XXX    X2       04-18     20
    # 9 FACE  YYY    Y1       01-18    400
    #10 FACE  YYY    Y1       02-18    400
    #11 FACE  YYY    Y1       03-18    400
    #12 FACE  YYY    Y1       04-18      0
    

    或者如果我们需要base R 方法,请在ave 中使用相同的方法

    df$Sales1 <- with(df, ave(Sales1, Categ, Brand1, Product1, 
          FUN = function(x) pmax(x, c(0, x[-length(x)]), c(x[-1], 0))))
    df$Sales1
    #[1] 300 300 300   0   0  20  20  20 400 400 400   0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 2023-02-20
      • 1970-01-01
      相关资源
      最近更新 更多