将函数中的变量传递给 data.table for lm()

Pass variables in function to data.table for lm()

我想在所有 data.table 列上为 运行 lm() 创建一个函数,但要指定从属 (x) 和按列。 data.table、x 和 by 参数被传递给函数。

我正在使用 David Arenburg 的 data.table [解决方案][1] 和 lapply() 来计算 lm() 并尝试使用 deparse() 和 substitute() 通过函数传递变量没有成功。

下面是所需 data.table 结果的 MWE 和我的函数尝试,试图将参数作为变量而不是引用的字符串传递。

我认为这涉及非标准评估(我确实阅读了 Advanced R 中的 NSE,但我的理解并不完全)。

感谢任何帮助,谢谢!

library(data.table)

set.seed(123)

# Sample dataset
data1 <- data.table(colA = 1:10,
                    colB = runif(10),
                    colC = runif(10),
                    colD = rep(c("apples", "bananas"),5))

# Desired functionality with .SDcols and by
works <- data1[, .(lm_results = lapply(.SD, function(x) {
  lm_summary = summary(lm(colA ~ x))})),
  .SDcols = -c("colA"),
  by = .(colD)]


# attempted function
fun1 <- function(dt, y, by_col) {

  x <- dt[, .(lm_results = lapply(.SD, function(x) {
    summary(lm(substitute(y) ~ x))})),
    .SDcols = -c(deparse(substitute(y)),),
    by = .(substitute(by_col))]

  return(x)
}

fails <- fun1(data1, colA, colD)
#> Error in `[.data.table`(dt, , .(lm_results = lapply(.SD, function(x) {: column or expression 1 of 'by' or 'keyby' is type symbol. Do not quote column names. Usage: DT[,sum(colC),by=list(colA,month(colB))]

reprex package (v0.3.0)

于 2019-10-16 创建

使用 中的 quotesubstitute 调整您的 lm 公式和 .SDcols:

fun1 <- function(dt, y, by_col) {
    expr <- quote(dt[, 
        .(lm_results=lapply(.SD, function(x) summary(lm(Y ~ x)))),
        .SDcols=sdcols,
        by=byexpr])
    eval(do.call(substitute, list(expr, 
        list(sdcols=substitute(!y), Y=as.name(y), byexpr=substitute(by_col)))))
}

fun1(data1, "colA", colD)

不酷的是 colA 需要作为字符串传入。

输出:

      colD   lm_results
1:  apples <summary.lm>
2:  apples <summary.lm>
3: bananas <summary.lm>
4: bananas <summary.lm>