Hydro Asked: 2024-11-12 23:20:31 +0800 CST2024-11-12 23:20:31 +0800 CST 2024-11-12 23:20:31 +0800 CST 如何在 R 数据框中用增量值替换零? 772 我有一个数据集,我想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)) 5 个回答 Voted margusl 2024-11-12T23:50:12+08:002024-11-12T23:50:12+08:00 set.seed(123) DF <- data.frame(Year = 1981:2000, Value = sample(0:5, 20, replace = T)) idx <- which(DF$Value == 0) DF$Value[idx] <- seq_along(idx) * .001 DF #> 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 创建于 2024-11-12,使用reprex v2.1.1 one 2024-11-12T23:48:17+08:002024-11-12T23:48:17+08:00 在 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)) Best Answer Jilber Urbina 2024-11-12T23:39:53+08:002024-11-12T23:39:53+08:00 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 Andre Wildberg 2024-11-12T23:49:25+08:002024-11-12T23:49:25+08:00 val <- DF$Value == 0 transform(DF, Value = replace(Value, val, (cumsum(val) * 0.001)[val])) 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 2024-11-13T00:03:14+08:002024-11-13T00:03:14+08:00 我们可以做到 # DF$Value = with(DF, { i = Value==0; replace(Value, i, .001 * cumsum(i)[i]) }) 给予 [1] 2.000 5.000 2.000 1.000 1.000 5.000 2.000 4.000 3.000 [10] 5.000 5.000 0.001 1.000 2.000 4.000 2.000 2.000 0.002 [19] 3.000 0.003
创建于 2024-11-12,使用reprex v2.1.1
在 dplyr 中:
在 R 基中等价地:
我们可以做到
给予