7

私は R を使用しており、2 つの data.framesAB. どちらも 6 行ありますが、A25000 列 (遺伝子) があり、B30 列あります。のすべての列とのすべての列である2f(x,y)つの引数を持つ関数を適用したいと思います。これまでのところ、次のようになります。xAyB

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

これには 2 つの問題があります。私の Python プログラミングからは、このようなカウンターを追跡するのは面倒だと思います。また、R プログラミングからは、for ループに神経質になっています。applyただし、この問題に適用する方法(または適用する必要がある場合)がよくわからず、apply誰かが私を啓発してくれることを望んでいました。f()今のところ、アトミック (実際には ) として扱う必要がありcor.test()ます。

4

3 に答える 3

7

データ フレームを使用しているため、これを行うには 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)
于 2010-08-24T15:29:12.890 に答える
3

一部のデータ

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
于 2010-08-24T15:20:25.877 に答える
1

apply のネストは機能しますが、最も簡単な構文ではありません。

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
于 2010-08-24T15:02:32.533 に答える