在管道R工作流程中为大多数data.frame变量名称添加前缀或后缀

Sam*_*rke 14 r dplyr magrittr

我想为data.frame中的大多数变量名添加后缀或前缀,通常是在它们以某种方式进行转换之后和执行连接之前.如果不打破我的管道,我没有办法做到这一点.

例如,使用此数据:

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))
Run Code Online (Sandbox Code Playgroud)

我想得到这个结果(注意变量名称):

  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
Run Code Online (Sandbox Code Playgroud)

我目前的做法是:

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")
Run Code Online (Sandbox Code Playgroud)

有没有替代那个笨重的最后一行打破我的管道?我看select()rename(),但不想明确指定每个变量的名字,因为我通常希望将所有重命名,除了单个变量,并可能有一个更广泛的data.frame比这个例子.

我正在想象一个最近的管道命令,它近似于这个组成的函数:

appendname(cols = 2:n, str = "_mean_2014", placement = "suffix")
Run Code Online (Sandbox Code Playgroud)

据我所知,这不存在.

and*_*yyy 20

您可以将函数传递给rename_at,也可以

 means14 <- dat14 %>%
  group_by(class) %>%
  select(-ID) %>%
  summarise_all(funs(mean(.))) %>% 
  rename_at(vars(-class),function(x) paste0(x,"_2014"))
Run Code Online (Sandbox Code Playgroud)

  • `rename_at`也接受公式,所以你甚至可以取消匿名函数`rename_at(vars(-class),〜paste0(.,"_ 201"))` (8认同)
  • 从 dplyr 1.0.0 开始,您现在可以使用 `rename_with`,`rename_with(~paste0(.,"_2014"), -class)` (3认同)

Sam*_*rke 6

自从发布此问题以来进行了额外的实验之后,我发现该setNames函数将与管道一起使用,因为它返回了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
Run Code Online (Sandbox Code Playgroud)


grr*_*bla 5

这有点快,但不完全是你想要的:

dat14 %>%
  group_by(class) %>%
  select(-ID) %>%
  summarise_each(funs(mean(.))) -> means14 

names(means14)[-1] %<>% paste0("_mean_2014")
Run Code Online (Sandbox Code Playgroud)

如果您之前没有使用过 %<>%-operator,请务必查看此链接,它是一个非常有用的工具。

你也可以用它来重新计算或四舍五入一些列,像这样df$meancolumn %<>% round(),等等,它经常出现,只是为你节省了很多写作时间