[英]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.