2010-08-27 107 views
5

我想创建一个自动生成单变量和多变量回归分析的函数,但我无法弄清楚如何在向量中指定**变量...... ** This似乎很容易,但撇去文件我还没有想通了那么远,R中的变量名称矢量

简单的例子

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

但K [1] =“a”和是一个字符向量... d是只是b附加到一个,而不是变量名称。实际上,我希望k [1]表示向量a。

感谢任何答案...

//中号

回答

10

您可以使用“获取”功能基于其名称的字符串来得到一个对象,但是从长远来看,这是最好的变量存储在一个列表只需以这种方式访问​​它们,事情变得更简单,您可以获取子集,可以使用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)]) 

或者你也可以使用“粘贴”或“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) 

还要注意多比较的问题,如果你正在寻找人y自动适应不同的模型。

+0

事实上,使用as.formula()比我使用的eval()parse()构造更清洁。 – 2010-08-27 16:04:34

+0

这是越来越好...... Thx – Misha 2010-08-27 16:44:13

+1

一个预先分配列表的好方法是通过vector(“list”,n),其中n是列表所假设元素的数量。对不起,有点偏离主题。 :) – 2010-08-27 17:08:38

3

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

2

get()方法是你在找什么:

summary(get(k[1])) 

编辑: get()方法是不是你要找什么,它的列表()。 get()也可能有用。

如果您正在寻找回归分析的自动生成过程,您可能会从使用eval()中受益匪浅,但每个R-programmer都会警告您使用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]) 
+0

这样做.. Thx一百万。 Misha – Misha 2010-08-27 15:41:12

+0

不客气。但实际上,Halpo是正确的。如果你想让k [1]表示向量a,那么你需要一个列表。这也值得一看。 – 2010-08-27 15:52:03