簡體   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