【问题标题】:How to pass and use a data frame to a function如何将数据框传递和使用到函数
【发布时间】:2019-11-11 08:47:53
【问题描述】:

我想在我定义的函数中传递和使用数据框。但我失败了。我想知道如何在 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。有谁知道如何解决这个问题?

【问题讨论】:

    标签: r function dataframe


    【解决方案1】:

    尝试以下方法:

    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 将替换名称 dviv1iv2 为您在函数调用中提供的参数名称(在您的情况下为 manwomanlove) .实际上,如果您在函数中打印对象公式的值,您将得到love ~ man + woman + I(man^2) + I(man * woman) + I(woman^2)。您也可以咨询相关的stackoverlock questionarticle of H. Wickham 以更好地了解其工作原理。

    【讨论】:

    【解决方案2】:

    您必须替换 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)
    

    【讨论】:

      【解决方案3】:

      该函数尝试在 R 全局环境中查找名为 love 的文字对象,而不是在数据框中搜索名称为 love 的列。我建议您阅读此答案以使用deparse(substitute()) 做您想做的事:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 2019-11-04
        相关资源
        最近更新 更多