簡體   English   中英

R:根據條件復制數據框列中的值

[英]R: Replicate value in the column of a dataframe based on a condition

我有以下數據框:

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 的解決方案。 任何人都可以幫忙嗎?

我們可以對按“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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM