我想为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)
自从发布此问题以来进行了额外的实验之后,我发现该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)
这有点快,但不完全是你想要的:
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()
,等等,它经常出现,只是为你节省了很多写作时间