R中函数的组合,应用n个函数的每个p长度组合

时间:2016-01-18 23:27:19

标签: r combinatorics

所以我有很多函数都在同一个向量上运行,比方说x。例如,它们可能是:

s1 = function(x) mean(x)
s2 = function(x) sd(x)
...
sn = function(x) 1/length(x)*sum(x^3)
x <- c(3, 1, 5, 2, 7, 2, 4, 2, 1)

我想生成许多这些函数的所有可能组合,并将每个组合应用于向量x。

到目前为止我所拥有的是combn函数,但它似乎只适用于这样的字符向量:

a <- c("s1", "s2", "s3", ..., "sn")
b <- combn(a, 2)
b
     [,1] [,2] [,3] ...
[1,] "s1" "s1" "s2" ...
[2,] "s2" "s3" "s3" ...

我需要的是一种轻松制作所有函数名称的向量的方法,以及一种将上面的列放在上面并将所有函数应用在一起的方法。 我知道plyr中的每个函数,除了combn的输出是一个字符向量,每个函数都需要实际的函数作为参数,而不是名称,它才能完美地工作。所以我需要的第二件事是转换方式

each("s1", "s2")

进入

each(s1, s2)

其中顶部是b矩阵的一列,第二个使用我在开始时定义的函数。

理想情况下,使用apply函数将最终代码应用于b的每一列。

对此部分的任何帮助我都无法弄清楚,或者对另一种方法的想法非常受欢迎。

3 个答案:

答案 0 :(得分:1)

如何将功能存储在列表中:

funs <- list(
  mean
  , max
  , function(x) 1)

然后,让数据向量为:

set.seed(202)
z <- runif(100)

为了获得您想要的结果,您可以像这样应用它们:

combn(
  length(funs)
  , 2
  , FUN = function(x) {
    lapply(
      # select the functions from the list that correspond to the combination
      funs[x]
      # apply each function in the list "fx" to the data vector
      , function(fx) fx(z)
    )
  }
)

结果如下:

     [,1]      [,2]      [,3]     
[1,] 0.4971414 0.4971414 0.9969858
[2,] 0.9969858 1         1    

答案 1 :(得分:1)

你可以跳过字符串 - &gt;函数查找,只需制作一个函数矩阵。然后apply(b, 1:2)依次评估每个函数:

> x <- c(3, 1, 5, 2, 7, 2, 4, 2, 1)
> a <- c(sum, mean, sd)
> b <- combn(a,2)
> str(b)
List of 6
 $ :function (..., na.rm = FALSE)  
 $ :function (x, ...)  
 $ :function (..., na.rm = FALSE)  
 $ :function (x, na.rm = FALSE)  
 $ :function (x, ...)  
 $ :function (x, na.rm = FALSE)  
 - attr(*, "dim")= int [1:2] 2 3        
> apply(b, 1:2, function(f) f[[1]](x))
     [,1] [,2] [,3]
[1,]   27   27    3
[2,]    3    2    2

答案 2 :(得分:-1)

要回答这个问题(而不是建议其他工作流程),我们可以通过封装会话的环境按名称访问变量(例如函数)。环境可以与R中的其他结构类似地使用,例如列表和数据框。

函数environment可用于获取当前环境。全局环境也可以.GlobalEnv使用(有关更多信息,请使用?environment)。以下是通过名称作为字符串访问函数的示例:

> f <- function(x) 2 * x
> g <- function(x) x^2
> h <- function(x) 1 / x
> for (fun in c("f", "g", "h")) 
+ print(sprintf("%s(3) = %s", fun, environment()[[fun]](3)))
[1] "f(3) = 6"
[1] "g(3) = 9"
[1] "h(3) = 0.333333333333333" 

有关R中的环境的更多信息,请查看Wickham's Advanced R tutorial on environments