R: передать переменную в lm внутри функции - PullRequest
0 голосов
/ 09 декабря 2018

Я хочу написать функцию, которая вызывает lm и строит точечную точку с линией регрессии, используя ggplot2.

Исходя из здесь , это мой код:

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 Ответ

0 голосов
/ 10 декабря 2018

Основная проблема в том, что вы пытаетесь использовать нестандартную оценку, и это может быть сложно.Это проще, если вы просто помещаете имена столбцов в кавычки, хотя все еще немного сложно, потому что вам нужно создать формулу для отправки на lm().Например, этот код работал бы, если бы n и o были строками с именами столбцов вместо имен без кавычек:

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...