Как передать и использовать фрейм данных для функции - PullRequest
1 голос
/ 11 ноября 2019

Я хочу передать и использовать фрейм данных в функции, которую я определил. Но я потерпел неудачу. Я хотел бы знать, как передать и использовать фрейм данных в R.

Я использовал следующий код:


# create example data

testData <- data.frame(man = c(9, 8, 3, 4, 8),         
                       woman = c(5, 4, 7, 1, 1),
                       love = c(1, 2, 3, 4, 5))


# define the function

polynomial <- function(iv1, iv2, dv, dataset){
  model <- lm(dv ~ iv1 + iv2 + I(iv1^2) + I(iv1 * iv2) + I(iv2^2), data = dataset)
  return(summary(model))
}

# use the function

polynomial(iv1 = man,
           iv2 = woman, 
           dv = love,
           dataset = testData)

Но я получил это сообщение об ошибке - Error in eval(predvars, data, env) : object 'love' not found. Кто-нибудь знает, как это решить?

Ответы [ 3 ]

5 голосов
/ 11 ноября 2019

Попробуйте следующее:

polynomial <- function(iv1, iv2, dv, dataset){
  formula <- substitute(dv ~ iv1 + iv2 + I(iv1^2) + I(iv1 * iv2) + I(iv2^2))
  model <- lm(formula = formula, data = dataset)
  return(summary(model))
}

Затем вы можете использовать его по своему желанию:

polynomial(iv1 = man,
           iv2 = woman, 
           dv = love,
           dataset = testData)

substitute заменит имена dv, iv1, iv2 с именами аргументов, которые вы предоставляете при вызове функции (в вашем случае man, woman, love). Действительно, если вы напечатаете значение формулы объекта в вашей функции, вы получите love ~ man + woman + I(man^2) + I(man * woman) + I(woman^2). Вы также можете обратиться к связанному вопросу о стеке блокировки или статье Х. Уикхема , чтобы лучше понять, как он работает.

1 голос
/ 11 ноября 2019

Вы должны подставить переменные внутри вызова lm (см. Полиномиальную функцию ниже)

И когда вы предоставляете переменные, это должна быть строка, в противном случае функция замены не будет работать ..

    polynomial <- function(iv1, iv2, dv, dataset){

    SUB=list(dv = as.name(dv),iv1=as.name(iv1),iv2=as.name(iv2))
    FORMULA = as.formula(substitute(dv ~ iv1 + iv2 + I(iv1^2) + I(iv1 * iv2) + I(iv2^2),SUB))
    model = lm(FORMULA,
      data=testData)
      return(summary(model))
    }

# use the function

polynomial(iv1 = "man",
           iv2 = "woman", 
           dv = "love",
           dataset = testData)
0 голосов
/ 11 ноября 2019

Функция пытается найти буквальный объект с именем love в глобальной среде R, а не искать во фрейме данных столбец с именем love. Я рекомендую вам прочитать этот ответ, чтобы делать то, что вы хотите, используя deparse(substitute()):

https://stackoverflow.com/a/36015931/11316205

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...