【问题标题】:Making a formula in R from a name根据名称在 R 中创建公式
【发布时间】:2014-05-02 02:05:07
【问题描述】:

我有一堆预测变量:

x<- c("pred1", "pred2", "pred3")

我想在for循环中写一个公式如下:

for (i in 1:length(x)){
   glmfit(y~x[i], data = myDF, family= "binomial")
}

现在,myDF 是一个数据框,其中“pred1”、“pred2”和“pred3”是列。但是,简单地输入x[i] 是行不通的。

感谢您的帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以用一个字符串来做一个公式

    > formula("y ~your_name_here")
    y ~ your_name_here
    

    然后您可以将其传递给glmfit 中的公式参数。

    这是一个例子

    dat<-data.frame(y=rnorm(10), x1=rnorm(10), x2=rnorm(30))
    sapply(names(dat)[-1],function(x) lm(formula(paste("y",x,sep="~")), data=dat))
    
    
    #alternatively using melt from reshape2 and dlply from plyr package
    library(reshape2)
    library(plyr)
    dlply(melt(dat, id=c("y")),.(variable), function(x) lm(y ~ value,data=x))
    

    【讨论】:

    • 通常,我们会使用paste 来实际构造要传递给formula 的字符串。
    • 是的,抱歉,正在起草一个实际示例。
    【解决方案2】:

    你想使用:

    for (i in 1:length(x)){
       glmfit(eval(parse(text=paste("y~",x[i]))), data = myDF, family= "binomial")
    }
    

    解释:

    eval(parse(text="2+2"))
    

    评估,作为 R 表达式提供给文本参数的字符串,因此您可以通过构造适当的字符串来生成您正在寻找的公式,然后在 glmfit 中评估它

    【讨论】:

    • 强制性参考:library(fortunes); fortune(106).
    • 你应该非常小心使用 parse/eval。这不是您在生产代码中想要的东西,因为您可能容易受到恶意攻击。考虑是否有人在哪里传递以下 x eval(parse(text=x[1]))
    • ^ 是的,所以如果字符串来自生产级别的用户,请不要使用此方法
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2023-01-10
    • 2020-11-01
    • 2012-12-10
    • 2023-03-06
    相关资源
    最近更新 更多