所以我有很多函数都在同一个向量上运行,比方说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的每一列。
对此部分的任何帮助我都无法弄清楚,或者对另一种方法的想法非常受欢迎。
答案 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。