我經常需要對數據框/矩陣中的每對列應用函數,並將結果以矩陣形式返回。現在我總是寫一個循環來做到這一點。例如,爲了使含我寫相關的p值的矩陣:是否有一個R函數將函數應用於每對列?
df <- data.frame(x=rnorm(100),y=rnorm(100),z=rnorm(100))
n <- ncol(df)
foo <- matrix(0,n,n)
for (i in 1:n)
{
for (j in i:n)
{
foo[i,j] <- cor.test(df[,i],df[,j])$p.value
}
}
foo[lower.tri(foo)] <- t(foo)[lower.tri(foo)]
foo
[,1] [,2] [,3]
[1,] 0.0000000 0.7215071 0.5651266
[2,] 0.7215071 0.0000000 0.9019746
[3,] 0.5651266 0.9019746 0.0000000
其作品,但對於非常大的矩陣相當緩慢。
Papply <- function(x,fun)
{
n <- ncol(x)
foo <- matrix(0,n,n)
for (i in 1:n)
{
for (j in 1:n)
{
foo[i,j] <- fun(x[,i],x[,j])
}
}
return(foo)
}
或用RCPP功能:
library("Rcpp")
library("inline")
src <-
'
NumericMatrix x(xR);
Function f(fun);
NumericMatrix y(x.ncol(),x.ncol());
for (int i = 0; i < x.ncol(); i++)
{
for (int j = 0; j < x.ncol(); j++)
{
y(i,j) = as<double>(f(wrap(x(_,i)),wrap(x(_,j))));
}
}
return wrap(y);
'
Papply2 <- cxxfunction(signature(xR="numeric",fun="function"),src,plugin="Rcpp")
但兩者都相當我可以在R(不與假設如上對稱的結果切削時間縮短了一半打擾)寫一個函數爲這個減緩甚至在100個變量的一個非常小的數據集(我認爲RCPP功能會更快,但我猜R和C之間的轉換++所有的時間採取它的通行費):
> system.time(Papply(matrix(rnorm(100*300),300,100),function(x,y)cor.test(x,y)$p.value))
user system elapsed
3.73 0.00 3.73
> system.time(Papply2(matrix(rnorm(100*300),300,100),function(x,y)cor.test(x,y)$p.value))
user system elapsed
3.71 0.02 3.75
所以我的問題是:
- 由於這些函數的簡單性,我認爲這已經在R的某個地方了。是否有應用程序或
plyr
函數執行此操作?我一直在尋找它,但一直沒能找到它。 - 如果是這樣,它是否更快?
好的,謝謝!相關p值僅僅是我今天遇到的一個例子。 – 2011-03-08 14:06:50