我有一个数据集,我想用递增值替换每个
zero
:第一个零变为 0.001,第二个 0.002,第三个 0.003,依此类推。每次出现零时,它应该比之前的替换增加 0.001。
set.seed(123)
DF <- data.frame(Year = 1981:2000, Value = sample(0:5, 20, replace = T))
library(dplyr)
DF %>%
filter(Value != 0) %>%
rbind(.,
DF %>%
filter(Value == 0) %>%
mutate(Value = cumsum(Value + .001))) %>%
arrange(Year)
Year Value
1 1981 2.000
2 1982 5.000
3 1983 2.000
4 1984 1.000
5 1985 1.000
6 1986 5.000
7 1987 2.000
8 1988 4.000
9 1989 3.000
10 1990 5.000
11 1991 5.000
12 1992 0.001
13 1993 1.000
14 1994 2.000
15 1995 4.000
16 1996 2.000
17 1997 2.000
18 1998 0.002
19 1999 3.000
20 2000 0.003
在 dplyr 中:
DF%>%
mutate(Value=if_else(Value==0,cumsum(Value==0)*0.001,Value))
相当于基础R:
DF$Value <- with(DF,ifelse(Value==0,cumsum(Value==0)*0.001,Value))
val <- DF$Value == 0
transform(DF, Value = replace(Value, val, unique(cumsum(val) * 0.001)[-1]))
Year Value
1 1981 2.000
2 1982 5.000
3 1983 2.000
4 1984 1.000
5 1985 1.000
6 1986 5.000
7 1987 2.000
8 1988 4.000
9 1989 3.000
10 1990 5.000
11 1991 5.000
12 1992 0.001
13 1993 1.000
14 1994 2.000
15 1995 4.000
16 1996 2.000
17 1997 2.000
18 1998 0.002
19 1999 3.000
20 2000 0.003