1
votes

Comment passer et utiliser une trame de données à une fonction

Je veux passer et utiliser un bloc de données dans une fonction que j'ai définie. Mais j'ai échoué. Je voudrais savoir comment passer et utiliser un bloc de données dans R.

Le code que j'ai utilisé est le suivant:

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

Mais j'ai eu ce message d'erreur - Erreur dans eval (predvars, data, env): objet 'love' introuvable . Quelqu'un sait-il comment résoudre ce problème?


0 commentaires

3 Réponses :


0
votes

La fonction essaie de trouver un objet littéral nommé love dans l'environnement global R, et non de rechercher dans le bloc de données une colonne avec le nom love . Je vous recommande de lire cette réponse pour faire ce que vous voulez en utilisant deparse (substitute ()) :

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


0 commentaires

1
votes

Vous devez remplacer les variables à l'intérieur de l'appel lm (voir la fonction polynomiale ci-dessous)

Et lorsque vous fournissez les variables, il doit s'agir d'une chaîne, sinon la fonction de substitution ne fonctionnera pas ..

< pré> XXX


0 commentaires

5
votes

Essayez ce qui suit:

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

Vous pouvez ensuite l'utiliser comme vous le souhaitez:

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

substitut remplacera les noms dv , iv1 , iv2 par les noms des arguments que vous fournissez dans votre appel de fonction (dans votre cas homme , femme , amour ). En effet, si vous imprimez la valeur de la formule objet dans votre fonction vous obtiendrez amour ~ homme + femme + I (homme ^ 2) + I (homme * femme) + I (femme ^ 2) . Vous pouvez également consulter une question stackoverlock ou la article de H. Wickham pour mieux comprendre comment ça marche.


2 commentaires

Génial ! si cette réponse a résolu votre problème, veuillez la marquer comme acceptée en cliquant sur la coche à côté de la réponse. voir: Comment l'acceptation d'une réponse fonctionne? pour plus d'informations


J'ai une autre question , pourriez-vous s'il vous plaît aidez-moi encore?