如何使用带有多个输入的函数的apply()?

时间:2013-08-11 18:58:36

标签: r function apply

我有一个10 x 5数据框和一个接收2个输入ab的函数。

a是一个向量,b是一个整数。

函数fun计算向量a的平均值,并将其乘以b并返回结果。在下面的代码中,我尝试将apply()此函数添加到x的每一列,但它似乎不起作用。求救!

x = data.frame(rnorm(10), rnorm(10), rnorm(10), rnorm(10), rnorm(10))

fun = function(a, b)
{
  c = mean(a) * b
  return(c)
}

apply(x, 2, fun(x,2))

2 个答案:

答案 0 :(得分:6)

如果要将多个参数传递给“apply”-ied函数,其中一个是列向量而另一个是常量,则可以通过两种方式完成;

apply(x, 2, fun, b=2)

OR:

apply(x, 2, function(x) {fun(x, 2)} )

R的可能看似奇怪的行为是表达式fun(x,2)不是函数而function(x) {fun(x, 2)}是。

 apply(x, 2, fun, b=2)
 #------------------
  rnorm.10. rnorm.10..1 rnorm.10..2 rnorm.10..3 rnorm.10..4 
-0.06806881  0.32749640 -0.14400234 -0.41493410 -0.02669955 

答案 1 :(得分:3)

这里问题很简单,因为你有b的常数值。但是,如果您有两个或两个以上的输入,则可以将它们用作列表,然后使用Map函数。以你的例子:

set.seed(1)
mydata<-data.frame(rnorm(10), rnorm(10), rnorm(10), rnorm(10), rnorm(10))
a<-as.list(names(mydata))
b<-as.list(rep(2,5)) # you can keep b<-2 it doesn't change the results since b is constant
myout<-Map(function(x,y) y*mean(mydata[,x]),a,b)
 >myout
[[1]]
[1] 0.2644056

[[2]]
[1] 0.4976899

[[3]]
[1] -0.2673465

[[4]]
[1] 0.2414604

[[5]]
[1] 0.2682734