我有以下数据框:
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的解决方案。 有人可以帮忙吗?
答案 0 :(得分:1)
我们可以在“销售1”的pmax
和lead
值上使用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