将函数中的变量传递给 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 创建
使用 中的 quote
和 substitute
调整您的 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>
我想在所有 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 创建使用 quote
和 substitute
调整您的 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>