2010-08-24 69 views
6

我使用R,並且我有兩個數據幀,AB。它們都有6行,但A有25000列(基因),而B有30列。我想申請一個帶有兩個參數f(x,y)的函數,其中xA的每一列,而yB的每一列。到目前爲止,它看起來像這樣:應用兩個數據幀

i = 1 
for (x in A){ 
    j = 1 
    for (y in B){ 
     out[i,j] <- f(x,y) 
     j = j + 1 
    } 
    i = i + 1 
} 

我有兩個問題與此:我關聯跟蹤計數器這樣的這些混沌從我的Python編程,並從我的[R編程我緊張的for循環。但是,我不太明白如何申請apply(或者即使我應該申請apply)這個問題,並希望有人可以啓發我。我現在需要將f()視爲原子(實際上是cor.test())。

+0

根據'f',這聽起來與內積類似。我知道外部產品你可以指定一個功能使用,但不知道如何去做內部產品。 – James 2010-08-24 15:19:09

+1

由於我是一個非常新的R用戶,我毫不猶豫地提出任何建議,但我使用plyr軟件包進行數據處理取得了很好的成功。 http://had.co.nz/plyr/ – dnagirl 2010-08-25 20:38:44

回答

6

由於您正在使用數據幀,因此使用lapply或sapply來執行此操作可能會更快(特別是您的數據幀的範圍)。例如,

x <- data.frame(col1=c(1,2,3,4), col2=c(5,6,7,8), col3=c(9,10,11,12)) 
y <- data.frame(col1=c(1,2,3,4), col2=c(5,6,7,8)) 
bl <- lapply(x, function(u){ 
    lapply(y, function(v){ 
     f(u,v) # Function with column from x and column from y as inputs 
    }) 
}) 
out = matrix(unlist(bl), ncol=ncol(y), byrow=T) 
1

嵌套的應用程序,但不是最簡單的語法。

x<-data.frame(col1=c(1,2,3,4), col2=c(5,6,7,8), col3=c(9,10,11,12)) 
y<-data.frame(col1=c(1,2,3,4), col2=c(5,6,7,8)) 

z<-apply(x,2,function(col,df2) 
      { 
       apply(df2,2,function(col2,col1) 
          { 
           col2+col1 
          },col) 
      },y) 

z 
col1 col2 col3 
[1,] 2 6 10 
[2,] 4 8 12 
[3,] 6 10 14 
[4,] 8 12 16 
[5,] 6 10 14 
[6,] 8 12 16 
[7,] 10 14 18 
[8,] 12 16 20 
+0

所以'function()'的第一個參數總是應用中引用的那個,然後你提供第二個參數作爲附加參數。謝謝! (A,2,function(a,B){apply(B,2,f,a)},B)' 但仍然困難得多閱讀比寫?如果f(a,b)不是對稱的,我想我必須寫一個包裝器... – 2010-08-24 15:12:23

2

一些數據

nrows <- 6 
A <- data.frame(a = runif(nrows), b = runif(nrows), c = runif(nrows)) 
B <- data.frame(z = rnorm(nrows), y = rnorm(nrows)) 

訣竅:記得與列expand.grid

counter <- expand.grid(seq_along(A), seq_along(B)) 
f <- function(x) 
{ 
    cor.test(A[, x["Var1"]], B[, x["Var2"]])$estimate 
} 

現在,我們只需要1個來電,apply

stats <- apply(counter, 1, f) 
names(stats) <- paste(names(A)[counter$Var1], names(B)[counter$Var2], sep = ",") 
stats