Search code examples
rtidyversemutate

keeping original and new variables in df


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