2012-08-02 34 views
3

這是我打算做(對於相當多的變量和數據集):循環:變量的選擇相關函數r中

mygroupdf <- data.frame (varname = c("A", "B", "c1", "D2", 
    "E", "F", "g1"), group = c(1, 1, 1, 2,3,3,4)) 

> mygroupdf 
     varname group 
    1  A  1 
    2  B  1 
    3  c1  1 
    4  D2  2 
    5  E  3 
    6  F  3 
    7  g1  4 

該數據幀只包含對變量分組的信息:

group 1 = A, B, c1 
group 2 = D2 
group 3 = E, F 
group 4 = g1 

第二個數據集 - 包含實際數據

set.seed(1234) 
dataf <- data.frame (yvar = rnorm (10, 10,3), 
    A = sample(c(1,0), 10, T), B = sample(c(1,0), 10, T), 
    c1 = sample (c(1,0), 10, T), D2 = sample (c(1,0), 10, T), 
    E= sample (c(1,0), 10, T),F = sample (c(1,0), T), 
    g1 = sample (c(1,0), 10, T)) 

# manual workout: 
xtemp <- dataf$A* dataf$B * dataf$c1 # all from group 1 
# I error in previous version it is * not + 
# (is product of all members of a group i.e. 
xtemp <- dataf$D2 (- group 2) 
xtemp <- dataf$E * dataf$F (- group 3) 
xtemp <- dataf$G (- group 4) 

隨後的相關性與Yvar產品:

x <- cor(dataf$yvar, xtemp) 

我想把它換到一個函數,這樣我可以在我的數據集將其應用於1000組的變量。

corrfun <- function (x, V1, V2, V3) { 
      xtemp <- V1 * V2 + V3 
      x <- cor(dataf$yvar, xtemp) 
      return (x) 
      } 

由於不同的羣體有不同的變量,我不知道我怎樣才能建立這樣一個功能,適用於整個數據集。請幫助 !

編輯:過程:

enter image description here

+0

不確定我跟着你說不同的羣體有不同的變量。既然這是'data.frame',是不是會變得一樣?你在談論不同的變量名稱嗎? – Maiasaura 2012-08-02 21:25:24

+0

@Maiasaura請參閱我最近的編輯,實際上我在創建xtemp時有錯誤的是「*」而不是「+」。 – SHRram 2012-08-02 21:36:44

+0

有兩個數據集。問題是創建變量xtemp的時候,可能有n個變量。 – SHRram 2012-08-02 21:38:04

回答

3

我敢打賭猜...

corrfun <- function (group.no, x=dataf, x.lookup=mygroupdf) { 
    xtemp <- apply(x[x.lookup$varname[x.lookup$group == group.no]], 1, prod) 

    out <- cor(x$yvar, xtemp) 

    return (out) 
} 

>  corrfun(1) 
[1] 0.35593 
> corrfun(2) 
[1] 0.4181311 
> 
+0

感謝您的答案和猜測(的確是正確的猜測!!!),我們可以投入循環,而不是每次都輸入group.no。 – SHRram 2012-08-02 22:17:43

+1

你可以或者你可以使用'sapply(unique(mygroupdf $ group),corrfun)' – Justin 2012-08-02 22:19:32

+0

你的代碼將失敗一個subtile錯誤:在默認設置下,'mygroupdf $ varname'將是一個因素,並且將一個data.frame一個因素將使用其數值,而不是其字符解釋。你會得到正確的輸出格式,但錯誤的數字。 – MvG 2012-08-02 22:52:05

0

另一個答案..

cbind(
    group = unique(mygroupdf$group), 
    corr = 
    do.call(
     c, 
     lapply(
     unique(mygroupdf$group), 
     function(x) { 
      varnames <- unique(mygroupdf[mygroupdf$group == x, 'varname']) 
      products <- apply(as.matrix(dataf[, colnames(dataf) %in% varnames]), 1, prod) 
      cor(products, dataf$yvar) 
     } 
    ) 
    ) 
) 

這給

 group  corr 
[1,]  1 0.3559300 
[2,]  2 0.4181311 
[3,]  3   NA 
[4,]  4 -0.1015003 
0
sapply(unique(mygroupdf$group), function(x) { 
    a <- as.character(mygroupdf$varname[mygroupdf$group == x]) 
    cor(dataf$yvar, apply(dataf[a],1,prod)) 
}) 
  1. 獨特:識別唯一的組號
  2. sapply:他們每個人的應用功能
  3. 一個< - ...:a是相應的變量名
  4. dataf [a]:從數據框中選擇適當的列
  5. 申請(...... PROD):的每一行計算產品
  6. 心病:歸屬關係
  7. sapply:與結果相結合,以一個簡單的載體
0

而且使用的是創建另一個答案我目前最喜歡的圖書館:

library(plyr) 
ddply(mygroupdf, .(group), summarise, 
     cor=cor(dataf$yvar, apply(dataf[as.character(varname)],1,prod))) 

This會產生以下結果:

group  cor 
1  1 0.3559300 
2  2 0.4181311 
3  3   NA 
4  4 -0.1015003 
Warning message: 
In cor(dataf$yvar, apply(dataf[as.character(varname)], 1, prod)) : 
    the standard deviation is zero