R:根据条件复制数据框列中的值

时间:2019-09-06 15:53:56

标签: r dataframe repeat replicate

我有以下数据框:

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的解决方案。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我们可以在“销售1”的pmaxlead值上使用lag,这些值按“类别”,“品牌1”和“产品1”分组

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