Передать переменные в функцию в data.table для lm () - PullRequest
1 голос
/ 17 октября 2019

Я хочу создать функцию для запуска lm () для всех столбцов data.table, но указать зависимую (x) и по столбцам. Data.table, x и by аргументы передаются в функцию.

Я использую data.table [решение] [1] Дэвида Аренбурга с lapply () для вычисления lm () и пытаюсь передать переменныечерез функцию с deparse () и substitute () без успеха.

Ниже приведен MWE желаемого результата data.table и моя попытка функции, пытающаяся передать аргументы как переменные, а не как строки в кавычках.

Я считаю, что это связано с нестандартной оценкой (я читал NSE в Advanced R, но мое понимание не совсем там).

Любая помощь приветствуется, спасибо!

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))]

Создано в 2019-10-16 в пакете Представ (v0.3.0)

1 Ответ

1 голос
/ 17 октября 2019

Использование quote и substitute из Передача имени переменной в качестве аргумента в 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 необходимо передать в виде строки.

output:

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