I am trying to mean-center multiple variables at the same time. I am using the code below, which is replacing the original variables with the mean-centered variables. I want to keep BOTH the original variables and mean-centered variables. Does anyone know how I could modify my code to do that?
vars_to_mc <- c("interview_age_1_year", "pea_wiscv_tss_baseline",
"cbcl_scr_dsm5_adhd_r_baseline",
"cbcl_scr_syn_external_r_baseline", "upps_y_ss_positive_urgency_baseline", "upps_y_ss_negative_urgency_baseline",
"upps_y_ss_sensation_seeking_baseline", "upps_y_ss_lack_of_planning_baseline", "upps_y_ss_lack_of_perseverance_baseline",
"bis_y_ss_bis_sum_baseline", "dd_prs_resid", "ext_prs_resid",
"pos_urg_prs_resid",
"neg_urg_prs_resid", "ss_prs_resid", "preMedit_prs_resid", "pers_prs_resid",
"attentional_prs_resid", "non_plan_prs_resid", "motor_prs_resid", "educ_prs_resid",
"ple_p_ss_total_number_1_year", "ple_y_ss_total_number_1_year")
# Mean-center
df1 <- df %>%
mutate_at(vars(vars_to_mc), ~ . - mean(., na.rm = TRUE)) %>%
rename_at(vars(vars_to_mc), ~ paste0(., "_mc"))
>Solution :
You can do this with dplyr::across() by providing the .names argument:
A glue specification that describes how to name the output columns. This can use
{.col}to stand for the selected column name, and{.fn}to stand for the name of the function being applied.
Without .names, the function is applied to the columns in place. With .names, new columns are creating using its specification.
I’ll use mtcars as an example:
vars_to_mc <- c("mpg", "cyl", "disp")
mtcars |>
mutate(
across(
all_of(vars_to_mc),
\(x) x - mean(x, na.rm = TRUE),
.names = "{.col}_mc"
)
)
Incidentally, dplyr::mutate_at() is now deprecated. The current way to select variables from a character vector is dplyr::all_of().
Output:
mpg cyl disp hp drat wt qsec vs am gear carb mpg_mc cyl_mc disp_mc
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 0.909375 -0.1875 -70.721875
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 0.909375 -0.1875 -70.721875
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 2.709375 -2.1875 -122.721875
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 1.309375 -0.1875 27.278125
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 -1.390625 1.8125 129.278125
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 -1.990625 -0.1875 -5.721875
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 -5.790625 1.8125 129.278125
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 4.309375 -2.1875 -84.021875
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 2.709375 -2.1875 -89.921875
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 -0.890625 -0.1875 -63.121875
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 -2.290625 -0.1875 -63.121875
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 -3.690625 1.8125 45.078125
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 -2.790625 1.8125 45.078125
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 -4.890625 1.8125 45.078125
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 -9.690625 1.8125 241.278125
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 -9.690625 1.8125 229.278125
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 -5.390625 1.8125 209.278125
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 12.309375 -2.1875 -152.021875
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 10.309375 -2.1875 -155.021875
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 13.809375 -2.1875 -159.621875
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 1.409375 -2.1875 -110.621875
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 -4.590625 1.8125 87.278125
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 -4.890625 1.8125 73.278125
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 -6.790625 1.8125 119.278125
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 -0.890625 1.8125 169.278125
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 7.209375 -2.1875 -151.721875
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 5.909375 -2.1875 -110.421875
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 10.309375 -2.1875 -135.621875
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 -4.290625 1.8125 120.278125
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 -0.390625 -0.1875 -85.721875
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 -5.090625 1.8125 70.278125
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 1.309375 -2.1875 -109.721875