首页 文章

R:在函数内部将变量传递给lm

提问于
浏览
0

我想编写一个调用 lm 的函数,并使用 ggplot2 绘制带有回归线的散点图 .

来自here,这是我的代码:

fun <- function(m, n, o, p) {
  library(ggplot2)
  data <- as.data.frame(read.table(file = m, header = T, dec = ".", sep = "\t" ))
  fit <- lm(as.formula(n ~ 0 + o), data)
  text<-paste("R^2 = ", summary(fit)$adj*100, " %; coefficient = ", fit$coefficients, sep="")
  ggplot(data, aes(x=!!rlang::enquo(o), y = !!rlang::enquo(n))) + geom_point(aes(colour = !!rlang::enquo(p))) + geom_abline(intercept=0, slope=fit$coefficients[1], color='#2C3E50', size=1.1) + geom_text(aes(x = 1, y = 1, label = text))
}

示例输入文件:

columna columnb string
3338240000  97.65   ccc
3453970000  98.8    ccc
3559920000  99.5    aaa
1434400000  87.8    ccc
2953560000  99.8    ccc
3172212857  99.15   ccc
3286080000  99.3    ccc
3750630000  99.3    ccc
4215180000  99.7    ccc
2836200000  99.85   ccc
229830000   93.8    rrr
39120000    94.5    ppp
1770180000  99  ccc

当我用这个函数调用时

fun("input", columna, columnb, string)

我收到一个错误 . 如何在函数内正确地将变量(列名)传递给lm?

1 回答

  • 1

    主要问题是您正在尝试使用非标准评估,这可能很棘手 . 如果你只是将列名放在引号中会更容易,但仍然有点棘手,因为你需要创建发送到 lm() 的公式 . 例如,如果 no 是命名列而不是不带引号的列名的字符串,则此代码将起作用:

    fla <- substitute(n ~ 0 + o, list(n = as.name(n), o = as.name(o)))
    fit <- lm(fla, data)
    

    您还需要修改 ggplot2 调用 . 这似乎有效,但我不知道 ggplot2 足以知道它是否是"right"方式:

    ggplot(data, aes(x=data[[o]], y = data[[n]])) + 
        geom_point(aes(colour = data[[p]])) + 
        geom_abline(intercept=0, slope=fit$coefficients[1], color='#2C3E50', size=1.1) + 
        geom_text(aes(x = 1, y = 1, label = text)) +
        labs(x = o, y = n, color = p)
    

    通过这些更改,您应该可以使用带引号的名称调用 fun ,例如

    fun("input", "columna", "columnb", "string")
    

相关问题