这不是与this相同的问题,而是一个扩展名。基于您在mutate
中创建的变量并动态命名它们的最快方法是什么。例如
library(dplyr)
df<- data.frame(gg = rep(6:10),
ba = rep(1:5))
df
gg ba
1 6 1
2 7 2
3 8 3
4 9 4
5 10 5
所需的输出:
df_new
gg ba diff.1 diff.2 sum_dif.1 sum_dif.2
1 6 1 5 10 25 50
2 7 2 5 10 25 50
3 8 3 5 10 25 50
4 9 4 5 10 25 50
5 10 5 5 10 25 50
按照我提到的类似问题,我可以获得diff.1
diff.2
myfun <- function(df, n) {
varname <- paste("diff", n , sep=".")
mutate(df, !!varname := (gg - ba)*n)
}
for(i in 1:2) {
df <- myfun(df, n=i)
}
给出
df
gg ba diff.1 diff.2
1 6 1 5 10
2 7 2 5 10
3 8 3 5 10
4 9 4 5 10
5 10 5 5 10
但不确定如何将生成的变量传递给mutate中的另一行,我想是这样的:
myfun <- function(df, n) {
varname <- paste("diff", n , sep=".")
varname2 <- paste("sum_dif", n , sep=".")
mutate(df, !!varname := (gg - ba)*n,
!!varname2 := sum(!!varname))
}
还很高兴获得其他解决方案,也许是data.table
吗?谢谢
答案 0 :(得分:1)
我们需要在进行评估(!!
)之前将字符串转换为符号
myfun <- function(df, n) {
varname <- paste("diff", n , sep=".")
varname2 <- paste("sum_dif", n , sep=".")
mutate(df, !!varname := (gg - ba)*n,
!!varname2 := sum(!! rlang::sym(varname)))
}
现在,我们应用myfun
for(i in 1:2) {
df <- myfun(df, n=i)
}
df %>%
select(gg, ba, matches('^diff'), matches('^sum'))
# gg ba diff.1 diff.2 sum_dif.1 sum_dif.2
#1 6 1 5 10 25 50
#2 7 2 5 10 25 50
#3 8 3 5 10 25 50
#4 9 4 5 10 25 50
#5 10 5 5 10 25 50