通过函数

时间:2017-05-17 13:04:18

标签: r dataframe

我的情况是我想要"坚持"现有data.frame的一堆列,其中每列是一个在其他列上进行数学运算的函数。我的目标是:

  1. 我想指定一次
  2. 的功能
  3. 我不想担心必须以正确的顺序传递参数和/或按名称匹配它们
  4. 我想指定一次应用函数的顺序
  5. 我希望新列名称是函数名称
  6. 理想情况下,我想要类似的东西:

    df <- data.frame(a = rnorm(10), b = rnorm(10))
    y <- function (x) a + b
    z <- function (x) b * y
    df2 <- lapply (list (y, z), df)
    

    其中df2是一个包含4列的data.frame:a,b,y和z。我认为这实现了目标。

    我最接近的是:

    df <- data.frame(a = rnorm(10), b = rnorm(10))
    y <- function (x) x$a + x$b
    z <- function (x) x$b * x$y
    funs <- list (
      y = y,
      z = z
    )
    df2 <- df
    df2$y <- funs$y(df2)
    df2$z <- funs$z(df2)
    

    这实现了目标1和2,但不是3和4。

    提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这可能是你想要的东西。在定义dfapply函数之后,除了使用表达式而不是函数之外,它可以非常类似于你的初衷而没有太多像x $ a等的东西。

dfapply <- function(exprs, df){
    for (expr in exprs) {
        df <- within(df, eval(expr))
    }
    df
}

df <- data.frame(a = rnorm(10), b = rnorm(10))
expr1 <- expression(y <- a + b)
expr2 <- expression(z <- b * y)
df2 <- dfapply(c(expr1, expr2), df)