将R

时间:2019-12-11 08:02:45

标签: r dataframe

我想根据以下示例将负值转换为零。我知道如何替换value2列,但是作为并行操作在第一列(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

2 个答案:

答案 0 :(得分:2)

您可以使用

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

如此

> 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

答案 1 :(得分:1)

您只需执行以下操作即可

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

为了娱乐,您可以使用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