Recoding variables in many columns

I would like to recode data in many columns, making 5 become 1,
making 4 become 2, making 2 become 4, making 1 become 5, to change the
direction of negative-worded item questions. Value of 3 I will leave intact.
How do I do this ?

You can use the dplyr function mutate_at() to do this. mutate_at() is a scoped version of the mutate() function meaning it essentially performs a mutate() on many variables at once.

Say your data is stored in the table tbl and you want to switch the direction of the variables x, y and z.

mutate_at(tbl, vars(x,y,z), ~6-.)

Here's my data, here's which variables I want you to do things to, and here's what I want you to do.

That last bit is a "lambda function" and basically just replaces the . with whatever variables you've chosen. The above is the equivalent of writing:

mutate(tbl, x = 6 - x, y = 6 - y, z = 6 - z)

If you're familiar with it, the mutate_at() function works with the pipe, much like the mutate() function does:

tbl %>% mutate_at(vars(x,y,z),~6-.)

If you have the magrittr package and find the 6-. a little hard to read, then thesubtract() function will also work in the lambda function:

tbl %>% mutate_at(vars(x,y,z),~subtract(6,.))

Also within the magrittr package is the %<>% update pipe which will store the results back into the tbl table variable:

tbl %<>% mutate_at(vars(x,y,z),~subtract(6,.))

Which is equivalent to:
tbl <- tbl %>% mutate_at(vars(x,y,z),~subtract(6,.))

Thank you for detailed reply. I thought that I should use case_when() to accomplish that.

You could use case_when(), however, this would over complicate things. You'd have to write out all five cases (4 flipped and the value 3 remaining the same), whereas mathematically just doing 6-x does the same thing

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.