【问题标题】:R: pass variable to lm inside functionR:将变量传递给函数内部的lm
【发布时间】:2018-12-09 20:21:00
【问题描述】:

我想编写一个调用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?

【问题讨论】:

  • 我不使用geom_smooth 的原因是,我想将R2 的值和系数写入绘图。我更新了我的问题。

标签: r function ggplot2 lm rlang


【解决方案1】:

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

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

您还需要修改ggplot2 调用。这似乎可行,但我不太了解ggplot2,不知道这是否是“正确”的做法:

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

【讨论】:

  • subsitute 我得到error in as.name(n) : Object 'columna' not found
  • 我已经编辑了答案以显示您需要如何调用 fun()。
猜你喜欢
  • 1970-01-01
  • 2015-01-31
  • 2020-02-13
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2012-03-03
相关资源
最近更新 更多