[英]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 循环的代码。 所以我真的需要解决这个问题。
lapply
, sapply
, apply
一次只处理一个向量/列表。 也就是说, apply
一次只会调用一列的 function。 您需要的是mapply
或Map
。
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)
但是mapply
和Map
允许任意数量的列表/向量,例如
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.