【问题标题】:Use variables from formula in R function在 R 函数中使用公式中的变量
【发布时间】:2013-05-19 11:50:25
【问题描述】:

我想编写一个myfunction(y,data) 类型的函数,ydata 的列名。您是否知道如何对其进行编码以便在调用时能够使用公式myfunction(y~,data=mydata)

另外,我如何在函数中使用data$y 形式的东西?

【问题讨论】:

  • 为什么具体需要公式?
  • 没有特殊需要,我只是想给函数传一个colname
  • 然后我将传递一个字符串并像这样使用它:data[[string]].

标签: r function formula


【解决方案1】:

也许你应该看看model.frame

model.frame(formula= z~y,data=data.frame(y=1:3,x=1:3,z=1:3))
  z y
1 1 1
2 2 2
3 3 3

结果是一个data.frame,其中包含公式中使用的变量。

【讨论】:

    【解决方案2】:

    您可以使用以下形式的公式:

    my_function(~y, dat)
    

    并在函数内使用as.character 检索它。然后只需使用as.character 结果中的第二个元素来索引向量:

    dat[[as.character(formula)[2]]]
    

    或者干脆跳过公式直接传递字符串:

    dat[[string]]
    

    【讨论】:

    • 使用 as.character 时,结果如下:[1] "~" "Species" Species are the colnames of y...
    • 知道如何在函数中使用 data$y 之类的东西吗?
    • @WAF 你没有。 $ 函数主要用于交互使用。您正在寻找[[。如data[[myCol]]。或者可能是data[,myCol]
    【解决方案3】:

    如果您只需要将单个列名作为不带引号的字符串传递,请使用:

    myfunction <- function(y, data)
    {
        colname <- as.character(substitute(y))
    
        data[, colname]
    }
    

    例子:

    myfunction(mpg, mtcars)
    

    请注意,选择列是使用方括号完成的,而不是美元符号。那是因为$ 不会评估参数,而是会查找名为"colname" 的列。

    【讨论】:

      【解决方案4】:

      请注意,y~ 不是有效的公式语法,但y~. 可以。使用它:

      1) 试试这个:

      myfunction <- function(y, data) {
         if (inherits(y, "formula")) y <- all.vars(y)[1]
         data[[y]]
      }
      

      2) 或者这个使用 S3 调度的更可扩展的版本:

      # generic
      myfunction <- function(y, data) UseMethod("myfunction")
      
      # formula method
      myfunction.formula <- function(y, data) {
          y <- all.vars(y)[1]
          NextMethod()
      }
      
      # default method
      myfunction.default <- function(y, data) data[[y]]
      

      测试一下(任何一种解决方案都应该给出相同的结果):

      > myfunction(demand ~ ., BOD)
      [1]  8.3 10.3 19.0 16.0 15.6 19.8
      > myfunction("demand", BOD)
      [1]  8.3 10.3 19.0 16.0 15.6 19.8
      

      这也有效:

      > myfunction(~ demand, BOD)
      [1]  8.3 10.3 19.0 16.0 15.6 19.8
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-06
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多