簡體   English   中英

應用兩個數據框

[英]Apply over two data frames

我正在使用R,我有兩個data.frames, 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編程中我對循環感到緊張。 但是,我不太明白如何申請apply (或者即使我應該申請apply ),也希望有人可以啟發我。 我現在需要將f()視為原子(實際上是cor.test() )。

由於您使用的是數據框,因此使用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)

一些數據

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

但是,嵌套應用的工作,而不是最簡單的語法。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM