R根据先前的列对新列进行变异,并动态命名它们

时间:2018-09-05 14:07:15

标签: r dplyr data.table

这不是与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吗?谢谢

1 个答案:

答案 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