I want to add a suffix or prefix to most variable names in a data.frame, typically after they've all been transformed in some way and before performing a join. I don't have a way to do this without breaking up my piping.
For example, with this data:
library(dplyr) set.seed(1) dat14 <- data.frame(ID = 1:10, speed = runif(10), power = rpois(10, 1), force = rexp(10), class = rep(c("a", "b"),5))
I want to get to this result (note variable names):
class speed_mean_2014 power_mean_2014 force_mean_2014 1 a 0.5572500 0.8 0.5519802 2 b 0.2850798 0.6 1.0888116
My current approach is:
means14 <- dat14 %>% group_by(class) %>% select(-ID) %>% summarise_each(funs(mean(.))) names(means14)[2:length(names(means14))] <- paste0(names(means14)[2:length(names(means14))], "_mean_2014")
Is there an alternative to that clunky last line that breaks up my pipes? I've looked at select()
and rename()
but don't want to explicitly specify each variable name, as I usually want to rename all except a single variable and might have a much wider data.frame than in this example.
I'm imagining a final piped command that approximates this made-up function:
appendname(cols = 2:n, str = "_mean_2014", placement = "suffix")
Which doesn't exist as far as I know.
You can pass functions to rename_at, so do
means14 <- dat14 %>% group_by(class) %>% select(-ID) %>% summarise_all(funs(mean(.))) %>% rename_at(vars(-class),function(x) paste0(x,"_2014"))
After additional experimenting since posting this question, I've found that the setNames
function will work with the piping as it returns a data.frame:
dat14 %>% group_by(class) %>% select(-ID) %>% summarise_each(funs(mean(.))) %>% setNames(c(names(.)[1], paste0(names(.)[-1],"_mean_2014"))) class speed_mean_2014 power_mean_2014 force_mean_2014 1 a 0.5572500 0.8 0.5519802 2 b 0.2850798 0.6 1.0888116
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With