Home > database >  scale a df but it's not numeric?
scale a df but it's not numeric?

Time:06-29

I have a df (called env) of environmental measurements I'm looking to scale by using the following code:

scale.env <- scale(env, center=TRUE, scale=TRUE)

but I'm getting the error

scale.env <- scale(env, center=TRUE,scale=TRUE)
Error in colMeans(x, na.rm = TRUE) : 'x' must be numeric

I tried to convert env to numeric but received the same error.

env <-lapply(env, as.numeric)
> str(env)
List of 5
 $ X00940_Cl_mg_per_L        : num [1:282] 0.3 0.31 0.31 1.83 2 ...
 $ X00945_SO4_mg_per_L_as_SO4: num [1:282] 9.8 8.03 8.62 6.53 6.66 ...
 $ X71851_NO3_mg_per_L_as_NO3: num [1:282] 0.19 0.23 0.23 NA NA NA NA 0.96 0.38 6.43 ...
 $ X00950_F_mg_per_L         : num [1:282] 0.07 0.07 0.06 0.07 0.08 NA 0.13 0.16 0.16 NA ...
 $ X00602_TN_mg_per_L_as_N   : num [1:282] 1.19 0.58 0.65 0.8 0.74 NA 0.7 1.44 1.12 1.55 ...

Any insight is appreciated!! Please note the dput below is before I convert to numeric.

dput(env)
structure(list(X00940_Cl_mg_per_L = c("0.3", "0.31", "0.31", 
"1.83", "2"), X00945_SO4_mg_per_L_as_SO4 = c(9.8, 8.03, 8.62, 
6.53, 6.66), X71851_NO3_mg_per_L_as_NO3 = c("0.19", "0.23", "0.23", 
NA, NA), X00950_F_mg_per_L = c("0.07", "0.07", "0.06", "0.07", 
"0.08"), X00602_TN_mg_per_L_as_N = c("1.19", "0.58", "0.65", 
"0.8", "0.74")), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))

CodePudding user response:

If you want to write the data that lapply produces back into a data frame, use the [] notation. This will preserve your data frame's attributes

env[] <- lapply(env, as.numeric)

Then you can do

scale(env, center = TRUE, scale = TRUE)

CodePudding user response:

Use data.frame after lapply

env <- data.frame(lapply(env, as.numeric))

# then scale

scale.env <- scale(env, center=TRUE, scale=TRUE)
  • Related