繁体   English   中英

如何将应用(或 sapply)与矩阵列或 dataframe 用作 function 参数

[英]how to use apply (or sapply) with columns of matrix or dataframe as function args

我知道这是一个愚蠢的新手问题,但我已经尝试了很长时间并且需要一些输入。 基本上,我正在尝试学习如何使用 apply 系列来省略 for 循环,特别是如何设置调用,以便矩阵的列用作 arguments 到 function。 我将以对 rbinom function 的简单调用为例。

示例:这个 for 循环工作正常。 数据是一组整数和一组概率

success <- rep(-1, times=10)                             # initialize result var
num <- sample.int(20, 10)                                # get 10 random integers 
p <- runif(10)                                           # get 10 random probabilities
for (i in 1:10) {
  success[i]= rbinom(n=1, size=num[i],prob=p[i])          # number successes in 1 trial
} 

但是如何对 apply 家庭做同样的事情呢? 我首先将数据放入矩阵的 2 列中,认为这是正确的开始。 但是,以下内容不起作用,显然是由于我对如何设置调用申请的理解不足。

myData <- matrix(nrow=10, ncol=2)
myData[,1] <- num
myData[,2] <- p
success <- apply(myData, rbinom, n=1, size=myData[,1], prob=myData[,2])

非常感谢任何提示,我将从 Fortran 来到 R,并尝试移植大量加载了 DO 循环的代码。 所以我真的需要解决这个问题。

lapplysapplyapply一次只处理一个向量/列表。 也就是说, apply一次只会调用一列的 function。 您需要的是mapplyMap

myData <- matrix(nrow=10, ncol=2)
myData[,1] <- num
myData[,2] <- p
mapply(rbinom, n = 1, myData[,1], myData[,2])
#  [1]  5  4 11  8  3  3 17  8  0 11

就像lapply返回一个列表一样, Map也是如此; 同样,就像sapply一样,如果所有返回值都兼容,则mapply将返回一个向量或数组,否则它也返回一个list

这些调用是等效的:

sapply(1:3, function(z) z + 1)
mapply(function(z) z + 1, 1:3)

但是mapplyMap允许任意数量的列表/向量,例如

func <- function(X,Y,Z) X^2+2*Y-Z
Map(func, 1:9, 11:19, 21:29)
## effectively the same as
list(
  func(1, 11, 21),
  func(2, 12, 22),
  func(3, 13, 33),
  ...,
  func(9, 19, 29)
)

sapply对您的数据的等效调用将是

sapply(seq_len(nrow(myData)), function(ind) {
  rbinom(n = 1, size = myData[ind,1], prob = myData[ind,2])
})

虽然我个人觉得mapply更容易阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM