我想根据以下示例将负值转换为零。我知道如何替换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
答案 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