Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding prefix or suffix to most data.frame variable names in piped R workflow

Tags:

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.

like image 487
Sam Firke Avatar asked Apr 29 '15 15:04

Sam Firke


2 Answers

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")) 
like image 64
andyyy Avatar answered Oct 11 '22 23:10

andyyy


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 
like image 41
Sam Firke Avatar answered Oct 11 '22 23:10

Sam Firke