![](/img/trans.png)
[英]Is there a way to apply a function with multiple arguments over two data frames in R?
[英]Apply over two data frames
我正在使用R,我有两个data.frames, A
和B
它们都有6行,但A
有25000列(基因), B
有30列。 我想应用一个带有两个参数f(x,y)
其中x
是A
每一列, y
是B
每一列。 到目前为止它看起来像这样:
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.