如何将“应用”与 returns 错误维度的函数一起使用 (R)
How to use ‘apply’ with function that returns wrong dimensions (R)
我有一个与各种脚本一起使用的通用函数,returns 一个维度大于一的向量。但是,我想将此函数与“apply”一起使用,并仅使用返回向量中的一个结果。有没有办法不用重写被调用的函数就可以做到这一点??
这是一个玩具示例。我定义函数“dummy”,它接受一个向量和 returns 2 向量中的最小值和最大值。我想调用它来使用“应用”逐列对矩阵进行操作,但我只对最小答案感兴趣(下例中的“b”)。有办法吗?
dummy <- function(x)
{
a <- max(x)
b <- min(x)
return(c(a,b))
}
z <- matrix(c(2,3,4,5,6,7,8,9,10), nrow = 3)
apply(z, 2, dummy)
这给出了答案5,5,这是废话。有没有办法将 dummy 作为匿名函数传递,以便我只对 z 的每一列使用返回向量的第二个元素?
或许你可以从下面的例子中得到一些启发。
匿名函数使用硬编码函数 dummy
和另一个函数,参数 fun
设置为 log
.
dummy <- function(x){
a <- max(x)
b <- min(x)
c(a, b)
}
z <- matrix(c(2,3,4,5,6,7,8,9,10), nrow = 3)
apply(z, 2, dummy)
apply(z, 2, function(x, fun){
y <- dummy(x)
y <- fun(y[2])
y
}, fun = log)
#[1] 0.6931472 1.6094379 2.0794415
另一种可能性是 itworks
需要两个参数,向量 x
和一个根据具体情况选择的函数。
itworks <- function(x, fun){
qq <- quantile(x)
fun(qq[2])
}
apply(z, 2, itworks, fun = sin)
#[1] 0.5984721 -0.7055403 0.7984871
这里的要点是函数接受的参数可以是任何东西,包括其他函数。 apply
有 3 个强制参数,X
、MARGIN
和 FUN
,加上 dots
参数。在点参数中,只要 FUN
接受,你就可以传递任何你想要的东西。
我有一个与各种脚本一起使用的通用函数,returns 一个维度大于一的向量。但是,我想将此函数与“apply”一起使用,并仅使用返回向量中的一个结果。有没有办法不用重写被调用的函数就可以做到这一点??
这是一个玩具示例。我定义函数“dummy”,它接受一个向量和 returns 2 向量中的最小值和最大值。我想调用它来使用“应用”逐列对矩阵进行操作,但我只对最小答案感兴趣(下例中的“b”)。有办法吗?
dummy <- function(x)
{
a <- max(x)
b <- min(x)
return(c(a,b))
}
z <- matrix(c(2,3,4,5,6,7,8,9,10), nrow = 3)
apply(z, 2, dummy)
这给出了答案5,5,这是废话。有没有办法将 dummy 作为匿名函数传递,以便我只对 z 的每一列使用返回向量的第二个元素?
或许你可以从下面的例子中得到一些启发。
匿名函数使用硬编码函数 dummy
和另一个函数,参数 fun
设置为 log
.
dummy <- function(x){
a <- max(x)
b <- min(x)
c(a, b)
}
z <- matrix(c(2,3,4,5,6,7,8,9,10), nrow = 3)
apply(z, 2, dummy)
apply(z, 2, function(x, fun){
y <- dummy(x)
y <- fun(y[2])
y
}, fun = log)
#[1] 0.6931472 1.6094379 2.0794415
另一种可能性是 itworks
需要两个参数,向量 x
和一个根据具体情况选择的函数。
itworks <- function(x, fun){
qq <- quantile(x)
fun(qq[2])
}
apply(z, 2, itworks, fun = sin)
#[1] 0.5984721 -0.7055403 0.7984871
这里的要点是函数接受的参数可以是任何东西,包括其他函数。 apply
有 3 个强制参数,X
、MARGIN
和 FUN
,加上 dots
参数。在点参数中,只要 FUN
接受,你就可以传递任何你想要的东西。