创建执行计算的功能并将答案作为列添加到现有数据框

时间:2019-08-14 14:38:51

标签: r

我试图弄清楚如何创建用户定义的函数以对数据框中的一系列列执行计算,并将答案作为附加列添加到同一数据框中。为简单起见,我一直使用的测试示例是计算从一年到下一年的百分比增长,但是目标是能够创建更复杂且难以手动计算的复杂计算。

我一直在使用的练习数据是...

    a <- c(10, 12)
    b <- c(11, 9)
    df <- t(data.frame(a, b))
    df <- data.frame(df)
    colnames(df) <- c(2001, 2002))

哪个看起来像...

      2001 2002
    a   10   12
    b   11    9

我一直在使用的手动计算方法是...

    df$PercGrowth <- (df$`2002` - df$`2001`) / df$`2001` * 100

哪个返回:

      2001 2002 PercGrowth
    a   10   12   20.00000
    b   11    9  -18.18182

如何将其转换为用户定义的函数,在其中可以指定要执行计算的列,然后将答案作为派生值添加到数据框中?

最初我认为可行的是...

    pg <- function(data, c1, c2)
      df <- mutate(data, PercGrowth = ((df[c2] -df[c1]) / df[c1] * 100))

    pg(df, 1, 2)

但是我仍然收到错误消息:

错误:列PercGrowth的类数据不受支持。框架

如何使它工作?

1 个答案:

答案 0 :(得分:1)

这实际上比看起来要复杂-您需要使用dplyr代词和准引号来将列名作为函数中的参数传递。以下代码有效:

library(dplyr)

a <- c(10, 12)
b <- c(11, 9)
df <- t(data.frame(a, b))
df <- data.frame(df)
colnames(df) <- c("year1", "year2")

pg <- function(df, col1, col2) {
  quo_col1 <- enquo(col1)
  quo_col2 <- enquo(col2)
  df %>% 
    mutate(pct_growth = (!! quo_col2 - !! quo_col1) / !! quo_col1 * 100)
}

pg(df, year1, year2)

我将这些列重命名为字符串,以便于使用。您可以通过以下链接了解更多信息:https://dplyr.tidyverse.org/articles/programming.html

另一种选择是在您感兴趣的列名称上使用某种字符串匹配,使用这些列执行操作,然后将结果联接回主数据框。