我想创建一个函数来在所有 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/