r - 是否有将函数应用于每对列的 R 函数?

标签 r apply plyr

我经常需要对数据帧/矩阵中的每一对列应用一个函数,并在矩阵中返回结果。现在我总是写一个循环来做到这一点。例如,要制作一个包含相关性 p 值的矩阵,我可以这样写:

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

这有效,但对于非常大的矩阵来说很慢。我可以在 R 中为此编写一个函数(不必通过假设上述对称结果来将时间减半):
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")

但是,即使在包含 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执行此操作的功能?我已经找过了,但一直找不到。
  • 如果是这样,它会更快吗?
  • 最佳答案

    它不会更快,但您可以使用 outer以简化代码。它确实需要一个矢量化函数,所以这里我使用了 Vectorize制作函数的矢量化版本以获取两列之间的相关性。

    df <- data.frame(x=rnorm(100),y=rnorm(100),z=rnorm(100))
    n <- ncol(df)
    
    corpij <- function(i,j,data) {cor.test(data[,i],data[,j])$p.value}
    corp <- Vectorize(corpij, vectorize.args=list("i","j"))
    outer(1:n,1:n,corp,data=df)
    

    关于r - 是否有将函数应用于每对列的 R 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5233308/

    相关文章:

    r - 我可以聚合数据帧并在 R 中保留字符串变量吗?

    r - 轻松检查目标是否记录在其他变量中?

    R:为 dplyr 选择每两个连续行

    r - R 中带有凸多边形的主成分分析双标图

    R 更改嵌套列表的类型

    r - R 中滞后的 xts 对象

    python - 如何访问数据框滚动窗口中的单个元素

    python - Statsmodels Poisson glm 与 R 不同

    r - 如何将 data.table 融入人年中,并将年份后缀作为变量列?

    r - apply() 和 forceAndCall() 忽略 parent.frame() 中的 get()