We can try mapping through all numeric columns and when a zero (or a very small zero say 0.0000001) is found, then replace it with 0.0001.
library(tidyverse)
map_if(df[, 3:12], is.numeric, ~ ifelse(near(., 0), .0001, .)) %>%
bind_cols() %>%
{bind_cols(df[1:2], .)}
#> st Date OD pH DBO st.1 year Veg Water Soil Crop
#> 1 A 01/07/2005 8.0000 6.3 3.0000 A 2005 100 200.0000 80.0000 130.0000
#> 2 A 02/06/2005 7.0000 6.2 2.2000 A 2005 100 200.0000 80.0000 130.0000
#> 3 A 01/01/2005 0.0001 6.5 3.1000 A 2005 100 200.0000 80.0000 130.0000
#> 4 A 03/05/2006 6.0000 6.3 4.0000 A 2005 100 200.0000 80.0000 130.0000
#> 5 A 09/08/2006 6.8000 7.1 1.1000 A 2005 100 200.0000 80.0000 130.0000
#> 6 A 12/12/2006 7.3000 8.1 2.9000 A 2005 100 200.0000 80.0000 130.0000
#> 7 B 02/07/2005 6.8000 5.4 2.6000 B 2006 98 180.0000 0.1000 132.0000
#> 8 B 03/06/2005 6.0000 5.3 1.9000 B 2006 98 180.0000 84.0000 132.0000
#> 9 B 02/01/2005 6.2000 5.5 2.6000 B 2006 98 180.0000 84.0000 132.0000
#> 10 B 04/05/2006 0.0001 5.4 0.0001 B 2006 98 0.0001 84.0000 132.0000
#> 11 B 10/08/2006 5.8000 6.0 0.9000 B 2006 98 0.0001 84.0000 132.0000
#> 12 B 13/12/2006 6.2000 6.9 2.5000 B 2006 98 0.0001 84.0000 132.0000
#> 13 C 20/12/2006 6.5000 7.2 2.6000 C 2007 93 0.0001 79.0000 127.0000
#> 14 C 27/12/2006 6.8000 7.6 2.7000 C 2007 93 0.0001 79.0000 127.0000
#> 15 C 03/01/2007 7.2000 8.0 2.9000 C 2007 93 0.0001 79.0000 127.0000
#> 16 C 10/01/2007 7.5000 8.4 3.0000 C 2007 93 0.0001 0.0001 127.0000
#> 17 C 17/01/2007 7.9000 8.8 0.0001 C 2007 93 175.0000 79.0000 127.0000
#> 18 C 24/01/2007 8.3000 9.2 3.3000 C 2007 93 175.0000 79.0000 0.0001
#> 19 C 31/01/2007 8.7000 9.7 3.5000 C 2007 93 175.0000 79.0000 127.0000
#> 20 C 07/02/2007 9.2000 10.2 3.6000 C 2007 93 175.0000 79.0000 0.0001
#> Grass
#> 1 70.0000
#> 2 70.0000
#> 3 70.0000
#> 4 70.0000
#> 5 70.0000
#> 6 70.0000
#> 7 86.0000
#> 8 86.0000
#> 9 86.0000
#> 10 0.0001
#> 11 86.0000
#> 12 86.0000
#> 13 106.0000
#> 14 0.0001
#> 15 106.0000
#> 16 106.0000
#> 17 106.0000
#> 18 106.0000
#> 19 106.0000
#> 20 106.0000
Using across
:
df %>%
mutate(across(where(is.numeric), ~ifelse(near(., 0), 0.0001, .)))
#> st Date OD pH DBO st.1 year Veg Water Soil Crop
#> 1 A 01/07/2005 8.0000 6.3 3.0000 A 2005 100 200.0000 80.0000 130.0000
#> 2 A 02/06/2005 7.0000 6.2 2.2000 A 2005 100 200.0000 80.0000 130.0000
#> 3 A 01/01/2005 0.0001 6.5 3.1000 A 2005 100 200.0000 80.0000 130.0000
#> 4 A 03/05/2006 6.0000 6.3 4.0000 A 2005 100 200.0000 80.0000 130.0000
#> 5 A 09/08/2006 6.8000 7.1 1.1000 A 2005 100 200.0000 80.0000 130.0000
#> 6 A 12/12/2006 7.3000 8.1 2.9000 A 2005 100 200.0000 80.0000 130.0000
#> 7 B 02/07/2005 6.8000 5.4 2.6000 B 2006 98 180.0000 0.1000 132.0000
#> 8 B 03/06/2005 6.0000 5.3 1.9000 B 2006 98 180.0000 84.0000 132.0000
#> 9 B 02/01/2005 6.2000 5.5 2.6000 B 2006 98 180.0000 84.0000 132.0000
#> 10 B 04/05/2006 0.0001 5.4 0.0001 B 2006 98 0.0001 84.0000 132.0000
#> 11 B 10/08/2006 5.8000 6.0 0.9000 B 2006 98 0.0001 84.0000 132.0000
#> 12 B 13/12/2006 6.2000 6.9 2.5000 B 2006 98 0.0001 84.0000 132.0000
#> 13 C 20/12/2006 6.5000 7.2 2.6000 C 2007 93 0.0001 79.0000 127.0000
#> 14 C 27/12/2006 6.8000 7.6 2.7000 C 2007 93 0.0001 79.0000 127.0000
#> 15 C 03/01/2007 7.2000 8.0 2.9000 C 2007 93 0.0001 79.0000 127.0000
#> 16 C 10/01/2007 7.5000 8.4 3.0000 C 2007 93 0.0001 0.0001 127.0000
#> 17 C 17/01/2007 7.9000 8.8 0.0001 C 2007 93 175.0000 79.0000 127.0000
#> 18 C 24/01/2007 8.3000 9.2 3.3000 C 2007 93 175.0000 79.0000 0.0001
#> 19 C 31/01/2007 8.7000 9.7 3.5000 C 2007 93 175.0000 79.0000 127.0000
#> 20 C 07/02/2007 9.2000 10.2 3.6000 C 2007 93 175.0000 79.0000 0.0001
#> Grass
#> 1 70.0000
#> 2 70.0000
#> 3 70.0000
#> 4 70.0000
#> 5 70.0000
#> 6 70.0000
#> 7 86.0000
#> 8 86.0000
#> 9 86.0000
#> 10 0.0001
#> 11 86.0000
#> 12 86.0000
#> 13 106.0000
#> 14 0.0001
#> 15 106.0000
#> 16 106.0000
#> 17 106.0000
#> 18 106.0000
#> 19 106.0000
#> 20 106.0000
Created on 2021-11-30 by the reprex package (v2.0.1)