我想expected基于其他两列创建一个新列。通过添加 columnconst中的值并减去column 中的值来创建新列value。
我的数据:
df<-data.frame(product = rep(c('A','B'),each=4), data = seq(as.Date("2020-01-01"), as.Date("2020-01-04"), by = "day"),
value = c(10, 15, 0, 5, 20, 5, 10, 0), const = c(100, 0, 10, 0, 100, 0, 0, 10),
expected = c(90, 75, 85, 80, 80, 75, 65, 75))
> df
product data value const expected
1 A 2020-01-01 10 100 90
2 A 2020-01-02 15 0 75
3 A 2020-01-03 0 10 85
4 A 2020-01-04 5 0 80
5 B 2020-01-01 20 100 80
6 B 2020-01-02 5 0 75
7 B 2020-01-03 10 0 65
8 B 2020-01-04 0 10 75
Run Code Online (Sandbox Code Playgroud)
编辑数据:
TD<-data.frame(product = rep("A",4), data = seq(as.Date("2020-01-01"), as.Date("2020-01-04"), by = "day"),
value = c(15, 1, 2, 1, 0), value2 = c(10, 0, 10, 0, 100))
TD <- TD %>% group_by(product) %>% mutate(expected1 = cumsum(value2) - cumsum(value))
TD
product data value value2 expected1
<fct> <date> <dbl> <dbl> <dbl>
1 A 2020-01-01 15 10 -5
2 A 2020-01-02 1 0 -6
3 A 2020-01-03 2 10 2
4 A 2020-01-04 1 0 1
5 A 2020-01-05 0 100 101
TD_expected
product data value value2 expected1
1 A 2020-01-01 15 10 -5
2 A 2020-01-02 1 0 -6
3 A 2020-01-03 2 10 8
4 A 2020-01-04 1 0 7
5 A 2020-01-05 0 100 107
Run Code Online (Sandbox Code Playgroud)
注意:当 value2 大于 value1 时,我们将 value2 分配给预期的
您可以使用ave和cumsum。
df$expected <- ave(df$const - df$value, df$product, FUN=cumsum)
df
# product data value const expected
#1 A 2020-01-01 10 100 90
#2 A 2020-01-02 15 0 75
#3 A 2020-01-03 0 10 85
#4 A 2020-01-04 5 0 80
#5 B 2020-01-01 20 100 80
#6 B 2020-01-02 5 0 75
#7 B 2020-01-03 10 0 65
#8 B 2020-01-04 0 10 75
Run Code Online (Sandbox Code Playgroud)