2010-08-27 431 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