Q:

Overwrite lot of columns with mutate_at in R?

Given the following dataframe I am trying to mutate all but c and d columns using dplyr::mutate_at with lambda function but without luck:
structure(list(a = c(1, 2, 3), b = c(43, 2, -1), c = c(234242, 
-223, 1), d = c(1, 1, 2)), .Names = c("a", "b", "c", "d"), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"))

df %>% mutate_at(vars(-c("c", "d"), funs(x = x + rnorm(1, mean = mean(x), sd = sd(x))

I want to overwrite the existing a and b columns without the need to mutate each other manually.
Please advise.
NOTE: My real dataset is similar but it has 50 columns to mutate and add this normal distribution random variable value. I want to automate it except for specific columns.

A:

You were nearly there. Two little things to change:

Change x to .
Access the column names without quote marks: -c(c, d) instead of -c("c", "d").

This leads to
df %>% mutate_at(vars(-c(c, d)), funs(. + rnorm(1, mean = mean(.), sd = sd(.))))                                    

which works fine. Output is:
# A tibble: 3 x 4
      a     b       c     d
  <dbl> <dbl>   <dbl> <dbl>
1  3.05  56.6  234242     1
2  4.05  15.6    -223     1
3  5.05  12.6       1     2

A:

Just as a side note:
You could use: mutate_if
df1 %>% mutate_if(names(.)%in%c("a","b"), funs(. + rnorm(1, mean = mean(.), sd = sd(.))))

There, of course, you have to use " because you're comparing strings with each other.

