【问题标题】:vector of variable names in RR中的变量名向量
【发布时间】:2011-04-04 21:05:26
【问题描述】:

我想创建一个自动生成单变量和多变量回归分析的函数,但我无法弄清楚如何在向量中指定**变量...**这看起来很简单,但是略读到目前为止我还没有弄清楚的文档......

简单示例

a<-rnorm(100)
b<-rnorm(100)
k<-c("a","b")
d<-c(a,b)
summary(k[1])

但是 k[1]="a" and 是一个字符向量...d 只是 b 附加到 a,而不是变量名。实际上,我希望 k[1] 代表向量 a。

感谢任何答案...

//M

【问题讨论】:

    标签: variables r vector


    【解决方案1】:

    您可以使用“get”函数根据对象名称的字符串获取对象,但从长远来看,最好将变量存储在列表中并以这种方式访问​​它们,事情变得更加简单,您可以获取子集,可以使用 lapply 或 sapply 在每个元素上运行相同的代码。保存或删除时,您可以只处理整个列表,而不是尝试记住每个元素。例如:

    mylist <- list(a=rnorm(100), b=rnorm(100) )
    names(mylist)
    summary(mylist[[1]])
    # or
    summary(mylist[['a']])
    # or
    summary(mylist$a)
    # or 
    d <- 'a'
    summary(mylist[[d]])
    
    # or
    lapply( mylist, summary )
    

    如果您使用 lm(或其他建模函数)以编程方式创建用于分析的模型,那么一种方法是仅对数据进行子集化并使用“.”,例如:

    yvar <- 'Sepal.Width'
    xvars <- c('Petal.Width','Sepal.Length')
    fit <- lm( Sepal.Width ~ ., data=iris[, c(yvar,xvars)] )
    

    或者您可以使用“paste”或“sprintf”构建公式,然后使用“as.formula”将其转换为公式,例如:

    yvar <- 'Sepal.Width'
    xvars <- c('Petal.Width','Sepal.Length')
    my.formula <- paste( yvar, '~', paste( xvars, collapse=' + ' ) )
    my.formula <- as.formula(my.formula)
    fit <- lm( my.formula, data=iris )
    

    如果您正在查看自动拟合的许多不同模型,还要注意多重比较的问题。

    【讨论】:

    • 确实,使用 as.formula() 比我使用的 eval() parse() 结构干净得多。
    • 一个很好的预分配列表的方法是通过 vector("list", n) 其中 n 是列表应该包含的元素数。抱歉有点跑题了。 :)
    【解决方案2】:

    您可以使用列表k=list(a,b)。这将创建一个包含组件 a 和 b 的列表,但不是变量名称列表。

    【讨论】:

      【解决方案3】:

      get() 就是你要找的东西:

      summary(get(k[1]))
      

      编辑: get() 不是你要找的,它是 list()。不过 get() 也可能有用。

      如果您正在寻找回归分析的自动生成,您实际上可能会从使用 eval() 中受益,尽管每个 R 程序员都会警告您不要使用 eval(),除非您非常了解自己在做什么。使用前请仔细阅读有关 eval() 和 parse() 的帮助文件。

      一个例子:

      d <- data.frame(
        var1 = rnorm(1000),
        var2 = rpois(1000,4),
        var3 = sample(letters[1:3],1000,replace=T)
      )
      
      vars <- names(d)
      
      auto.lm <- function(d,dep,indep){
            expr <- paste(
                "out <- lm(",
                dep,
                "~",
                paste(indep,collapse="*"),
                ",data=d)"
            )
            eval(parse(text=expr))
            return(out)
      }
      
      auto.lm(d,vars[1],vars[2:3])
      

      【讨论】:

      • 不客气。但实际上哈尔波是对的。如果你想让 k[1] 表示向量 a,那么你需要一个列表。它也值得研究。
      猜你喜欢
      • 1970-01-01
      • 2022-11-15
      • 2018-10-31
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      相关资源
      最近更新 更多