Converting Character Values to Numeric in R: A How-To Guide

First, let’s create a dataset.

df= data.frame(location= rep(c("Illinois", "Iowa"), each = 12),  fertilizer= rep(c("A", "A", "A", "B", "B", "B", "C", "C", "C", "D", "D", "D"), times = 2),  block= rep(c("I", "II", "II"), times = 8),  yield= c('100', '99', '98', '125', "NA", '135', '140', '138', '128', '80', '87', '76', '130', "NA", '140', '145', '148', '152', "#DIV/0!", '158', '165', '80', '78', "NA"),  yield1= c(100, 99, 98, 125, NA, 135, 140, 138, 128, 80, 87, 76, 130, NA, 140, 145, 148, 152, NA, 158, 165, 80, 78, NA))
print(df)
   location fertilizer block   yield yield1
1  Illinois          A     I     100    100
2  Illinois          A    II      99     99
3  Illinois          A    II      98     98
4  Illinois          B     I     125    125
5  Illinois          B    II      NA     NA
6  Illinois          B    II     135    135
7  Illinois          C     I     140    140
8  Illinois          C    II     138    138
9  Illinois          C    II     128    128
10 Illinois          D     I      80     80
11 Illinois          D    II      87     87
12 Illinois          D    II      76     76
13     Iowa          A     I     130    130
14     Iowa          A    II      NA     NA
15     Iowa          A    II     140    140
16     Iowa          B     I     145    145
17     Iowa          B    II     148    148
18     Iowa          B    II     152    152
19     Iowa          C     I #DIV/0!     NA
20     Iowa          C    II     158    158
21     Iowa          C    II     165    165
22     Iowa          D     I      80     80
23     Iowa          D    II      78     78
24     Iowa          D    II      NA     NA

and observe the different data formats of each value.

str(df)
'data.frame':	24 obs. of  5 variables:
 $ location  : chr  "Illinois" "Illinois" "Illinois" "Illinois" ...
 $ fertilizer: chr  "A" "A" "A" "B" ...
 $ block     : chr  "I" "II" "II" "I" ...
 $ yield     : chr  "100" "99" "98" "125" ...
 $ yield1    : num  100 99 98 125 NA 135 140 138 128 80 ...

I have two sets of yield data: one in character format (yield column) and the other in numeric format (yield1 column).

How to convert missing value to 0 when data is numeric?

When data is numeric (yield1 column), and if there are missing values, how can we replace it to 0?

if(!require(dplyr)) install.packages("dplyr")
library(dplyr)

dataA= df %>%
       dplyr::mutate(yield_corrected= if_else(is.na(yield1), 0, as.numeric(yield1)))
print(dataA)
   location fertilizer block   yield yield1 yield_corrected
1  Illinois          A     I     100    100             100
2  Illinois          A    II      99     99              99
3  Illinois          A    II      98     98              98
4  Illinois          B     I     125    125             125
5  Illinois          B    II      NA     NA               0
6  Illinois          B    II     135    135             135
7  Illinois          C     I     140    140             140
8  Illinois          C    II     138    138             138
9  Illinois          C    II     128    128             128
10 Illinois          D     I      80     80              80
11 Illinois          D    II      87     87              87
12 Illinois          D    II      76     76              76
13     Iowa          A     I     130    130             130
14     Iowa          A    II      NA     NA               0
15     Iowa          A    II     140    140             140
16     Iowa          B     I     145    145             145
17     Iowa          B    II     148    148             148
18     Iowa          B    II     152    152             152
19     Iowa          C     I #DIV/0!     NA               0
20     Iowa          C    II     158    158             158
21     Iowa          C    II     165    165             165
22     Iowa          D     I      80     80              80
23     Iowa          D    II      78     78              78
24     Iowa          D    II      NA     NA               0

or you can also use the following code.

if(!require(dplyr)) install.packages("dplyr")
library(dplyr)

dataA1 = df %>%
         dplyr::mutate(yield1=coalesce(yield1, 0))
full code: https://github.com/agronomy4future/r_code/blob/main/Converting_Character_Values_to_Numeric_in_R_A_How_To_Guide.ipynb