D. Fowler
D. Fowler

Reputation: 635

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"))

Upvotes: 1

Views: 33

Answers (1)

SamR
SamR

Reputation: 20494

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

Upvotes: 2

Related Questions