【问题标题】:How to use apply() with a function that takes more than one input?如何将 apply() 与需要多个输入的函数一起使用?
【发布时间】:2013-08-13 02:09:49
【问题描述】:

我有一个 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))

【问题讨论】:

  • 查看?apply 的帮助页面,其中可能提到了... 参数。
  • 附带说明,在执行变量赋值时,更常见的样式是 R 是 <-。大多数人只在函数定义或调用中使用=,例如fun(a, b=2)。此外,return 语句是可选的。如果不使用,该函数将简单地返回最后一个值,例如,fun <- function(a, b) mean(a) * b

标签: r function apply


【解决方案1】:

如果您想将多个参数传递给“应用”函数,其中一个是列向量,另一个是常量,您可以通过两种方式进行;

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

或者:

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 

【讨论】:

  • 或者甚至只是apply(x, 2, fun, 2),尽管我更喜欢你的。
  • 是的,我更喜欢命名参数。尽管您看到我在第二个示例中没有这样做,因为我认为它更接近最初失败的努力的样子。
  • 这里不需要花括号apply(x, 2, function(x) fun(x, 2))
  • 没错,这里不需要花括号,但多步骤程序需要它们,我认为最好向新手展示如何使用它们。
  • @DWin 非常感谢您的回答。似乎只是这样......我得到的所有结果都是50,这似乎不太可能。
【解决方案2】:

这里的问题很简单,因为 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

【讨论】:

    猜你喜欢
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2016-01-23
    • 2018-08-30
    • 2023-03-31
    • 2022-11-14
    • 1970-01-01
    相关资源
    最近更新 更多