代码之家  ›  专栏  ›  技术社区  ›  user63230

R根据以前的列对新列进行变异并动态命名

  •  1
  • user63230  · 技术社区  · 7 年前

    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
    

    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 回复  |  直到 7 年前
        1
  •  1
  •   akrun    7 年前

    我们需要先将字符串转换为符号,然后再进行求值( !! )

    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