r - 将函数中的变量传递给 data.table 以进行 lm()

标签 r function data.table lm

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

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

下面是所需的 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于2019年10月16日创建(v0.3.0)

最佳答案

使用Pass variable name as argument inside data.table中的引用替换调整您的 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>

关于r - 将函数中的变量传递给 data.table 以进行 lm(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58423702/

相关文章:

r - 'sort.list'的'x'必须是原子的。您是否在列表中调用了 'sort'?与knn.cv

css - 使用 Shinymanager R 嵌入图像

创建一个以函数指针作为参数的函数指针

python - 将 R data.table 转换为 pandas.DataFrame 的最佳方法?

r - 使用 ggplot2 绘制奇怪的 map

r - R-tryCatch警告消息正在写入数据

javascript - call 和 apply 和有什么不一样?

javascript - 错误: Uncaught TypeError: undefined is not a function

r - 在使用过滤器时使用 get() 按列分组在某些情况下不起作用

r - 无法连接 data.table 结果来自 R 中的 foreach 循环