0

I would like to convert negative values to zeros according to the example below. I know how to replace the value2 column but as a parallel insert a zero in the first 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), value2 = c(-100, 10, -10, 0, -100, 0, -5, 10))

df_expected<-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(0, 15, 0, 5, 0, 5, 0, 0), value2 = c(0, 10, 0, 0, 0, 0, 0, 10))

> df
  product       data value value2
1       A 2020-01-01    10   -100
2       A 2020-01-02    15     10
3       A 2020-01-03     0    -10
4       A 2020-01-04     5      0
5       B 2020-01-01    20   -100
6       B 2020-01-02     5      0
7       B 2020-01-03    10     -5
8       B 2020-01-04     0     10

> df_expected
  product       data value value2
1       A 2020-01-01     0      0
2       A 2020-01-02    15     10
3       A 2020-01-03     0      0
4       A 2020-01-04     5      0
5       B 2020-01-01     0      0
6       B 2020-01-02     5      0
7       B 2020-01-03     0      0
8       B 2020-01-04     0     10
Zizou
  • 503
  • 5
  • 18

2 Answers2

2

You can use

df[df$value2<0,-(1:2)]<-0

such that

> df
  product       data value value2
1       A 2020-01-01     0      0
2       A 2020-01-02    15     10
3       A 2020-01-03     0      0
4       A 2020-01-04     5      0
5       B 2020-01-01     0      0
6       B 2020-01-02     5      0
7       B 2020-01-03     0      0
8       B 2020-01-04     0     10
ThomasIsCoding
  • 96,636
  • 9
  • 24
  • 81
1

You can do it simply by doing:

df[df$value2 < 0,c("value","value2")] <- 0

For fun, you can do it using dplyr:

df %>% mutate_at(.vars = vars(contains("value")),
                 .funs = list(~ ifelse(value2 < 0, 0, .)))

 product       data value value2
1       A 2020-01-01     0      0
2       A 2020-01-02    15     10
3       A 2020-01-03     0      0
4       A 2020-01-04     5      0
5       B 2020-01-01     0      0
6       B 2020-01-02     5      0
7       B 2020-01-03     0      0
8       B 2020-01-04     0     10
dc37
  • 15,840
  • 4
  • 15
  • 32